124:  二叉樹中最大路徑求和

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章