LeetCode 124: 二叉樹中最大路徑求和
給定一個非空二叉樹,返回其最大路徑和。 本題中,路徑被定義爲一條從樹中任意節點出發,達到任意節點的序列。 該路徑至少包含一個節點,且不一定經過根節點。 示例 1: 輸入: [1,2,3] 1 / \ 2 3 輸出: 6 示例 2: 輸入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7 輸出: 42
思路: 遞歸實現,求路徑最大值--> root.val+max(root.right)+max(root.left)
定義二叉樹:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
代碼實現:
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.res = float('-inf') # 定義全局變量,記錄最大值
def helper(root):
if not root: return 0
# 求左 | 右子樹的最大值,<0, 直接賦值=0, 剪枝不遍歷
left = max(helper(root.left), 0)
right = max(helper(root.right), 0)
cur_cost = left +right +root.val # 加入 root節點,記錄當前總和
self.res = max(self.res, cur_cost) # 更新最大值
# 返回左|右的一個最大分支,此時只能爲 左|右 一個分支
return root.val + max(left, right)
helper(root)
return self.res
測試代碼:
def Create_tree(self,root,list,i):
if i<len(list):
if not list[i]: return None
else:
root = TreeNode(list[i])
root.left = self.Create_tree(root.left,list,2*i+1)
root.right = self.Create_tree(root.right,list,2*i+2)
return root
return root
if __name__ =="__main__":
s = Solution()
nums = [-10,9,20,None,None,15,7]
nums = [1,2,3]
root = s.Create_tree(None,nums,0)
r = s.maxPathSum(root)
print(r)