二叉樹中的最大路徑和
題目描述
路徑 被定義為一條從樹中任意節點出發(並不是單純的從葉子節點到根節點),沿父節點-子節點連接,達到任意節點的序列。同一個節點在一條路徑序列中 至多出現一次 。該路徑 至少包含一個 節點,且不一定經過根節點。
路徑和 是路徑中各節點值的總和。
給你一個二叉樹的根節點 root ,返回其 最大路徑和 。
輸入輸出樣例
樣例一

輸入:root = [1,2,3]
輸出:6
解釋:最優路徑是 2 -> 1 -> 3 ,路徑和為 2 + 1 + 3 = 6
樣例二

輸入: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