二叉樹中的最大路徑和


二叉樹中的最大路徑和

題目描述

路徑 被定義為一條從樹中任意節點出發(並不是單純的從葉子節點到根節點),沿父節點-子節點連接,達到任意節點的序列。同一個節點在一條路徑序列中 至多出現一次 。該路徑 至少包含一個 節點,且不一定經過根節點。

路徑和 是路徑中各節點值的總和。

給你一個二叉樹的根節點 root ,返回其 最大路徑和 。

輸入輸出樣例

樣例一
img
輸入:root = [1,2,3]
輸出:6
解釋:最優路徑是 2 -> 1 -> 3 ,路徑和為 2 + 1 + 3 = 6
樣例二
img
輸入:root = [-10,9,20,null,null,15,7]
輸出:42
解釋:最優路徑是 15 -> 20 -> 7 ,路徑和為 15 + 20 + 7 = 42

題目解析

  • dp+dfs
    • 對於只有一個節點的樹來說,答案就是其本身。
    • 如果是如樣例一所示的,非常簡單的樹樹,那么就是1+2,1+3,1+2+3之間的最大值
    • 如果是一個十分復雜的樹,那么對於當前樹,且經過根節點的最大路徑是左子樹過其根節點最大值+根節點右子樹子樹過其根節點最大值+根節點左子樹過其根節點最大值+根節點+右子樹子樹過其根節點最大值
  • 注意:為什么要強調過根節點所有路徑的最大值,因為要想一直往上求則必須要通過根節點實現連接,因此必不可少需要一個全局變量來記錄目前得到的最大路徑(這個變量不會受到根節點的牽制
  • 上述的注意這是這道題的關鍵!!!

代碼實現

class Solution:
    def __init__(self):
        self.maxsum=float('-inf')#定義全局變量
    def maxPathSum(self, root: TreeNode) -> int:
        def dfs(node):
            if not node: 
                return 0
            left=max(dfs(node.left),0)
            right=max(dfs(node.right),0)
            self.maxsum=max(self.maxsum,left+node.val,right+node.val,left+node.val+right)
            return max(left+node.val,right+node.val)
            '''
            這里為什么沒有返回left+node.val+right
            因為左+根+右 如果傳上去,會導致上面過過根節點的路徑無法實現
            如樣例二:如果返回了15+20+7,那么上面再選-10,能組成路徑嗎?
            '''
        dfs(root)
        return self.maxsum


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM