1. 程式人生 > >【LeetCode 中等題】53-路徑總和II

【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)