給定乙個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。
示例1:
示例2:
遇到二叉樹的題,如果能用遞迴就盡量遞迴吧。
首先回顧遞迴三步驟:
1、遞迴終止條件及返回值
2、遞推條件
3、返回值分析處理
具體到這道題,採用遞迴的三個步驟具體化為:
1、遞迴終止條件為節點為空,返回值為0
2、遞推條件:分別遞迴左右子樹,計算左右子樹的節點和記為l和r
3、返回值及分析:max(0, l, r) + node.val
這個遞迴函式實現的是對於乙個根節點,通過計算分別計算其左右子樹節點和,來看其左右子樹是否有正增益。
實現部分的核心**就是self.sum的更新了。
self.
sum=
max(self.
sum,
max(
0, leftsum)
+max(0
,rightsum)
+root.val)
在更新self.sum時有兩個判斷,乙個是self.sum,另乙個包含了兩個max加上當前節點的值。
注意此處用的是
max(0
, leftsum)
+max(0
, rightsum)
+ root.val
這樣就是說如果左右子樹對於根節點無增益的話,就用0來替代左右子樹和,但同時也計算了當前節點的值。
對於這個遞迴函式,注意其計算順序,先計算左子樹的最大和,再計算右子樹的最大和,最後返回
max(0
, leftsum, rightsum)
+ root.val
在計算完左子樹最大和後,計算右子樹最大和時,**
self.
sum=
max(self.
sum,
max(
0, leftsum)
+max(0
,rightsum)
+root.val)
此處最外層max函式的左邊是左子樹最大和,右邊是右子樹最大和,self.sun更新後即為左右子樹中和較大的那乙個。
最後一次更新self.sum時,最外層max函式左邊為左右子樹最大和中較大的那乙個,右邊為左子樹增益(若左子樹和小於0則無增益,用0替代)加上右子樹增益加上根節點的和。
class
solution
:def
maxpathsum
(self, root: treenode)
->
int:
self.
sum=
float
('-inf'
)def
dfs(root):if
not root:
return
0 leftsum = dfs(root.left)
rightsum = dfs(root.right)
self.
sum=
max(self.
sum,
max(
0, leftsum)
+max(0
,rightsum)
+root.val)
return
max(
0, leftsum, rightsum)
+ root.val
dfs(root)
return self.
sum
二叉樹中的最大路徑和 遞迴
二叉樹中的最大路徑和 給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。package factory import tree.treenode description 二叉樹中的最大路徑和 author...
二叉樹最大路徑和 python 二叉樹最大路徑和
1.題目描述 輸入乙個二叉樹層次遍歷的結果,輸出這個二叉樹最大路徑和。路徑不一定從根節點開始和葉子節點結束。只要是連續的路徑就可以。如輸入 10,9,20,null,null,15,7 109 20 15 7 輸出 42 2.首先將乙個陣列還原成乙個二叉樹。然後根絕二叉樹的根節點返回最大路徑和。cl...
二叉樹中的最大路徑和 遞迴 分治
給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3 輸出 6 示例 2 輸入 10,9,20,null,null,15,7 10 920 15 7 輸出 42 def...