124 二叉樹中的最大路徑和

2021-09-25 17:01:05 字數 1337 閱讀 5042

題目:

給定乙個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。

示例 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 需要乙個函式...