124. Binary Tree Maximum Path Sum
Question: Binary Tree Maximum Path Sum
Solution
思路:
-
要找 path 的最大值 → DFS
-
root 最大值的算法是:node + 左邊總和最大 + 右邊總和最大 所以要往下知道 left & right children 總和的最大值。
要得知 left child 的最大值,一樣要往下知道 left child 的 left & right children 的值 → Recursive Function -
Recursive Function 要可以回傳該 node 目前算出的最大值
-
而該 node 的最大值可能會有三種:
- node 本身:因為如果 left / right node 是負數,就會把總合拉低
- node + 左邊總和最大
- node + 右邊總和最大
從上面三個值選出最大,return
-
最後,path 的算法可以是 node + 左邊最大 + 右邊最大,所以每次在 node ,計算以上三種情況時,也要把 path 的計算考慮進去,但是不用回傳,只需要另外用一個變數紀錄即可。只要加總是最大,就把變數記起來。
Recursive Function: dfs(node)
- 終止條件:
- 如果 node == None,代表走到底了,return 0: if node == None: return 0
- 遞回條件:
- left_max = dfs(node.left)
- right_max = dfs(node.right)
- 計算此 node path 的值: node.val + left_max + right_max
- 在 node 本身,node + left, node + right, node + left + right 中選出最大: max_val = max(node.val, node.val + left_max + right_max, node.val + left_max, node.val + right_max)
- return max(node.val, node.val + left_max, node.val + right_max)
TimeComplexity: O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxPathSum(self, root: Optional[TreeNode]) -> int:
max_val = [root.val]
def dfs(node):
if node == None:
return 0
left_max = dfs(node.left)
right_max = dfs(node.right)
node_max = max(node.val, node.val + left_max + right_max, node.val + left_max, node.val + right_max)
max_val[0] = max(max_val[0], node_max)
return max(node.val, node.val + left_max, node.val + right_max)
dfs(root)
return max_val[0]
Video Solution
Comments
Post a Comment