↓快轉到主要內容
  1. LeetCode/

LeetCode 113: Path Sum II

·1 分鐘· ·
LeetCode Medium Backtracking Tree Depth-First-Search Binary-Tree
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-11-18

  • 提交紀錄:Wrong Answer → Accepted → Wrong Answer → Accepted

解題思路
#

跟 LC 112 一樣往下減目標,但要記錄整條路徑(Backtracking):進入節點時把值加進路徑,到葉子時符合就存一份複本,離開時拿掉。

節點的值可以是負的,所以「目前總和已經超過目標」不代表後面不可能,不能剪枝。

我的嘗試
#

兩次 WA 都是同一個剪枝:targetSum - root.val < 0 就不往下走。但節點的值可以是負的,例如 [4, -1]、targetSum = 3:4 - 1 = 3,答案 [[4, -1]];這版在根就剪掉了,回傳空的。

正確解法
#

class Solution:
    def pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:
        res, path = [], []
        def dfs(node, rest):
            if not node:
                return
            path.append(node.val)
            rest -= node.val
            if not node.left and not node.right and rest == 0:
                res.append(path[:])                  # 存複本
            dfs(node.left, rest)
            dfs(node.right, rest)
            path.pop()
        dfs(root, targetSum)
        return res

複雜度
#

時間 O(n · h)(複製路徑),空間 O(h)。

要特別避免的錯誤
#

  • 值有負數時不能用「已經超過」來剪枝。
  • 存答案要存複本 path[:]。

面試口說整理
#

我用回溯維護目前的路徑,往下時把值加進去、目標減掉,到葉子時剛好是 0 就存一份複本,離開節點時把值拿掉。值可能是負的,所以不剪枝。時間 O(n · h)。

相關文章

LeetCode 129: Sum Root to Leaf Numbers
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Tree
LeetCode 129 解題筆記:往下走時目前的數字乘 10 加上節點的值,到葉子時加進總和
LeetCode 236: Lowest Common Ancestor of a Binary Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Tree Binary-Lifting
LeetCode 236 解題筆記:遞迴回傳子樹裡找到的 p 或 q;左右都找到代表在這裡分岔,這個節點就是 LCA
LeetCode 337: House Robber III
·1 分鐘
LeetCode Medium Dynamic-Programming Tree Depth-First-Search Binary-Tree
LeetCode 337 解題筆記:樹上 DP,每個節點回傳(搶它、不搶它)的最大值;不是一層一層交錯搶
LeetCode 1448: Count Good Nodes in Binary Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 1448 解題筆記:DFS 往下傳路徑上的最大值,節點的值大於等於它就是好節點
LeetCode 199: Binary Tree Right Side View
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 199 解題筆記:層序遍歷,每一層最右邊的節點就是從右邊看得到的
LeetCode 230: Kth Smallest Element in a BST
·1 分鐘
LeetCode Medium Tree Depth-First-Search Binary-Search-Tree Binary-Tree
LeetCode 230 解題筆記:BST 的中序遍歷是由小到大,迭代中序走到第 k 個就停