• 【LeetCode每天一题】Path Sum(二叉树的路径和)


    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

    Note: A leaf is a node with no children.

    Example:

    Given the below binary tree and sum = 22,

          5
         / 
        4   8
       /   / 
      11  13  4
     /        
    7    2      1
    

    return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

    思路


      这道题我们使用递归进行解决,递归结束条件为节点为空时返回False,还有一个就是就是当前节点为叶子节点(叶子节点就是左右节点为空),并且sum是否为0时返回True。

    解决代码


     1 # Definition for a binary tree node.
     2 # class TreeNode(object):
     3 #     def __init__(self, x):
     4 #         self.val = x
     5 #         self.left = None
     6 #         self.right = None
     7 
     8 class Solution(object):
     9     def hasPathSum(self, root, sum):
    10         """
    11         :type root: TreeNode
    12         :type sum: int
    13         :rtype: bool
    14         """
    15         if  not root:            # 空节点直接返回
    16             return False
    17         if root and not root.left and not root.right and root.val == sum:   # 当前节点为叶子节点,并且sum为0
    18             return True
    19         return self.hasPathSum(root.left, sum-root.val) or self.hasPathSum(root.right, sum-root.val)    # 左右节分别进行判断

    如果我们需要得到满足路径的值呢?

    Example:  Given the below binary tree and sum = 22,

          5
         / 
        4   8
       /   / 
      11  13  4
     /      / 
    7    2  5   1
    

    Return:

    [
       [5,4,11,2],
       [5,8,4,5]
    ]

    思路

      和上面那道题的解决方式一样,只不过多一个path和res来记录节点路径和结果列表。还是使用递归。
    解决代码

    
    
     1 # Definition for a binary tree node.
     2 # class TreeNode(object):
     3 #     def __init__(self, x):
     4 #         self.val = x
     5 #         self.left = None
     6 #         self.right = None
     7 
     8 class Solution(object):
     9     def pathSum(self, root, sum):
    10         """
    11         :type root: TreeNode
    12         :type sum: int
    13         :rtype: List[List[int]]
    14         """
    15         if not root:
    16             return []
    17         res = []
    18         self.path(root, sum, res, [])
    19         return res
    20         
    21     def path(self, root, sum, res, path):
    22         if not root:           # 为空直接返回
    23             return
    24         if not root.left and not root.right and root.val == sum:   # 判断该叶子节点的路径是否满足条件
    25             path.append(root.val)
    26             res.append(path)
    27             return
    28         self.path(root.left, sum-root.val, res, path+[root.val])     # 该节点的左子树
    29         self.path(root.right, sum-root.val, res,path+[root.val])     # 该节点的右子树
  • 相关阅读:
    老天待我不薄,又来这么一题POJ1753
    HDOJ4857【拓扑排序】
    二分匹配ZOJ3646
    poj3185//BFS随便切...
    poj2239 poj1274【二分匹配】
    每天一水poj1502【最短路】
    POJ1466/HDOJ1068 谈谈二分匹配的时间复杂度
    纯拓扑排序一搞poj2367
    poj1477(水)
    用动态链表high-poj 1528
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10878016.html
Copyright © 2020-2023  润新知