題目:
給定乙個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。
示例 1:
輸入: [1,2,3]
1
/ \2 3
輸出: 6
示例 2:
輸入: [-10,9,20,null,null,15,7]
-10/
9 20
/ 15 7
沒看題解獨自做出來的,還是蠻有成就感的。。
思路:按照題意,最長路徑可以是根到最下面,可以是根未到葉子節點,可以是根的左右兩枝合起來(即倒v型的),並且不限於根節點,故肯定要遞迴算每個節點了,還要有乙個全域性變數,算出乙個,就和全域性變數比較一下,大的話更新全域性變數。
我寫的:
class solution:
def maxpathsum(self, root: treenode) -> int:
res=float('-inf')
def func(node):
nonlocal res
if not node:
return
res=node.val
if node.left and node.right:
x1,x2=func(node.left),func(node.right)
res=max(res,node.val+x1,node.val+x2)
if node.val+x1+x2>res:
res=node.val+x1+x2 #這個res不能返回再遞迴,因為該結果用了當前節點的左右枝,無法包含其他節點了
elif node.left:
res=max(res,node.val+func(node.left))
elif node.right:
res=max(res,node.val+func(node.right))
if res>res:
res=res
print(node.val,res)
return res #當前節點為根的樹的最大路徑和
func(root)
return res
幾個問題:
1.我開始沒想到的地方,用例沒通過才發現的:當前考察的節點左右枝都有時,返回的值不能包含含左右枝的最大路徑和,畫個圖就明白了,這樣返回的路徑是無法再新增當前樹之外的節點的,這個值要單獨判斷一下,可以用來更新全域性變數,但不能返回!
2.node==none,直接返回0就行了
124 二叉樹中的最大路徑和
給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3 輸出 6示例 2 輸入 10,9,20,null,null,15,7 10 9 20 15 7 輸出 42思路 二...
124 二叉樹中的最大路徑和
給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3 輸出 6示例 2 輸入 10,9,20,null,null,15,7 10 9 20 15 7 輸出 42思路 對...
124 二叉樹中的最大路徑和
給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3輸出 6 class solution object def maxpathsum self,root 需要乙個函式...