# **Leetcode筆記(Binary Tree Maximum Path Sum)** :::info :information_source: 題目 : Binary Tree Maximum Path Sum, 類型 : binary tree , 等級 : hard 日期 : 2023/03/29,2023/05/24,2023/07/07,2023/10/30 ::: ### 嘗試 2023/05/24 ```python class Solution: def maxPathSum(self, root: Optional[TreeNode]) -> int: res = [float("-inf")] def dfs(node): if not node: return 0 left = max(dfs(node.left), 0) right = max(dfs(node.right), 0) # root + right + lrft (小樹自己繞一圈) res[0] = max(res[0], node.val + left + right) # 但還是繼續算 return node.val + max(left, right) return max(dfs(root), res[0]) ``` 2023/07/07 每次都回傳root + max(left, right),也就是只選中 + 左或中 + 右,在計算過程中也可以順便更新中 + 左 + 右, 特別留意的是,如果左右為負的話,可以直接只選中(因為不管選哪個,都會使sum變得更小) ```python class Solution: def __init__(self): self.res = float("-inf") def maxPathSum(self, root: Optional[TreeNode]) -> int: self.dfs(root) return self.res def dfs(self, node): if not node: return 0 # 如果left right leaf為負 可以直接忽略 只選root回傳 left = max(self.dfs(node.left), 0) right = max(self.dfs(node.right), 0) self.res = max(self.res, node.val + left + right) return node.val + max(left, right) ``` 2023/10/30 ```python class Solution: def __init__(self): self.res = float("-inf") def maxPathSum(self, root: Optional[TreeNode]) -> int: def findMax(node): if not node: return 0 leftSum = max(0, findMax(node.left)) rightSum = max(0, findMax(node.right)) self.res = max(self.res, node.val + leftSum + rightSum) return max(node.val + leftSum, node.val + rightSum) findMax(root) return self.res ``` --- ### **優化** 時間複雜度為 $O(n)$,其中 $n$ 是二叉樹的節點數量。這是因為在每個節點上都會執行一次 DFS 遍歷 這個程式碼的空間複雜度為 $O(h)$,其中 $h$ 是二叉樹的高度。這是因為在遞迴過程中,會使用 $O(h)$ 的額外空間,其中 $h$ 是函數調用堆棧的最大深度。 ```python class Solution: def maxPathSum(self, root: Optional[TreeNode]) -> int: res = [root.val] def dfs(node): if not node: return 0 # 回傳的是單支的最大值 leftmax = dfs(node.left) rightmax = dfs(node.right) # 如果是負數 則寧可取0 # 基本上這種變成0的取法 已經綜合考慮到單純加左樹或右樹 leftmax = max(leftmax, 0) rightmax = max(rightmax, 0) # 四個可能 : root右 / root左 / root / root右左 # root / root右左 res[0] = max(res[0], node.val + leftmax + rightmax) # root右 / root左 return node.val + max(leftmax, rightmax) dfs(root) return res[0] ``` --- **:warning: 錯誤語法** :::warning 似乎如果用list[0]去操作的話,就不會遇到local variable 'res' referenced before assignment 這個錯誤表示在函數中使用了一個未被賦值的局部變數。在 Python 中,函數內部的變量作用域是局部的,因此必須在函數內部使用 = 賦值運算符將變量初始化。 ::: **:thumbsup:學習** :::success The path sum of a path is the sum of the node's values in the path. ::: **思路** **講解連結** https://www.youtube.com/watch?v=Hr5cWUld4vU Provided by. NeetCode ###### tags: `binary tree` `hard` `leetcode`