【LeetCode 中等题】53-路径总和II

题目描述:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22

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

返回:

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

解法1。 回溯,返回到上一层时,记得pop,就是把刚刚那一层append的元素去掉,类似于复原自顶向下递归时这一层的样子,而非递归到底开始回溯的时候的样子。

class Solution(object):
    def pathSum(self, root, expectNumber):
        # write code here
        if not root:
            return []
        res = []
        path = []
        self.FindPathHelper(root, expectNumber, path, res)
        return res
    
    def FindPathHelper(self, root, target, path, res):
        if not root:
            return
        path.append(root.val)
        if root.val == target and not root.left and not root.right:
            res.append(path[:])
        self.FindPathHelper(root.left, target-root.val, path, res)
        self.FindPathHelper(root.right, target-root.val, path, res)
        path.pop() # 这个地方一定要加,不然输出的path会多出很多元素,也是回溯的必备

解法2。迭代的方式,用queue这个队列维护还未遍历过的节点,一开始只有root和截至root之前遍历的节点val这两者构成的元组,后来先左后右添加节点信息,先入先出,遇到叶子节点判断和是否等于target,是则将path放到res中。

class Solution(object):
    def pathSum(self, root, sum):
        """
        :type root: TreeNode
        :type sum: int
        :rtype: List[List[int]]
        """
        if not root: return []
        
        paths = []
        queue = []
        queue.append((root, []))
        while queue:
            tree, path = queue.pop()
            if not tree.left and not tree.right:
                if self.get_sum(path) + tree.val == sum:
                    path.append(tree.val)
                    paths.append(path)
            else:
                if tree.left:
                    p = path[:]
                    p.append(tree.val)
                    queue.insert(0, (tree.left, p))
                if tree.right:
                    p = path[:]
                    p.append(tree.val)
                    queue.insert(0, (tree.right, p))
        
        return paths
    
    def get_sum(self, nums):
        
        return sum(nums)

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/85995832