二叉樹中的最大路徑和 遞迴實現(Python版)

2021-10-08 14:40:11 字數 2040 閱讀 6574

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

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

示例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...