樹形dp (二叉樹中的最大路徑 最長距離)

2022-06-05 04:06:13 字數 2810 閱讀 8922

如果題目求解目標是s規則,則求解流程可以定成以每乙個節點為頭節點的子樹在s規則下的每乙個答案,並且最終答案一定在其中。

以某個節點x為頭節點的子樹中,分析答案有哪些可能性,並且這種分析是以x的左子樹、x的右子樹和x整棵樹的角度來考慮可能性的

根據第一步的可能性分析,列出所有需要的資訊

合併第二步的資訊,對在樹和右樹提出同樣的要求,並寫出資訊結構

設計遞迴函式,遞迴函式是處理以x為頭節點的情況下的答案。包括設計遞迴的basecase,預設直接得到左樹和右樹的所有資訊,以及把可能性做整合,並且要返回第三步的資訊結構這四個小步驟

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

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

示例 1:

輸入: [1,2,3]

1/ \

2 3

輸出: 6

示例 2:

輸入: [-10,9,20,null,null,15,7]

-10/ \

9  20

/  \

15   7

輸出: 42

思考:首先,考慮實現乙個簡化的函式 maxgain(node),該函式計算二叉樹中的乙個節點的最大貢獻值,具體而言,就是在以該節點為根節點的子樹中尋找以該節點為起點的一條路徑,使得該路徑上的節點值之和最大。

具體而言,該函式的計算如下。

空節點的最大貢獻值等於 0。

非空節點的最大貢獻值等於節點值與其子節點中的最大貢獻值之和(對於葉節點而言,最大貢獻值等於節點值)。

根據函式 maxgain 得到每個節點的最大貢獻值之後,如何得到二叉樹的最大路徑和?對於二叉樹中的乙個節點,該節點的最大路徑和取決於該節點的值與該節點的左右子節點的最大貢獻值,如果子節點的最大貢獻值為正,則計入該節點的最大路徑和,否則不計入該節點的最大路徑和。維護乙個全域性變數 maxsum 儲存最大路徑和,在遞迴過程中更新 maxsum 的值,最後得到的 maxsum 的值即為二叉樹中的最大路徑和。

#

definition for a binary tree node.

class

treenode:

def__init__

(self, x):

self.val =x

self.left =none

self.right =none

class

solution:

def__init__

(self):

self.maxsum = float("

-inf")

def maxpathsum(self, root: treenode) ->int:

defmaxgain(node):

ifnot

node:

return

0 leftgain =max(maxgain(node.left),0)

rightgain =max(maxgain(node.right),0)

pricenewpath = node.val+leftgain+rightgain

self.maxsum =max(self.maxsum,pricenewpath)

return node.val +max(leftgain,rightgain)

maxgain(root)

return self.maxsum

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

最大距離定義為,從二叉樹的節點a出發,可以向上或者向下走,但沿途的節點只能經過一次,到達節點b時路徑上的邊的個數叫作a到b的距離,那麼二叉樹任何兩個節點之間都有距離,求整棵樹上的最大距離。

思考:使用樹的高度,對於乙個節點,自身高度為1

求一棵樹中的最長路徑。對於節點 t ,以它為根的樹的最長路徑path一定是下列三個數中的最大值:

#

definition for a binary tree node.

class

treenode(object):

def__init__

(self, x):

self.val =x

self.left =none

self.right =none

class

solution(object):

defdiameterofbinarytree(self, root):

ifnot

root:

return

0 max_dia_left =self.diameterofbinarytree(root.left)

max_dia_right =self.diameterofbinarytree(root.right)

max_dia = max(self.get_depth(root.left)+self.get_depth(root.right),max_dia_left,max_dia_right) #

max: 1.當前結點最大距離;2.左、右子結點的最大距離

return

max_dia

def get_depth(self,root): #

計算以當前結點為根時,樹的最大深度;

ifnot

root:

return

0

else

:

return max(1+self.get_depth(root.left),1+self.get_depth(root.right))

124 二叉樹中的最大路徑和 樹形dp,最大深度

c 動態規劃,遞迴。樹形dp。官方題解 首先,考慮實現乙個簡化的函式 maxgain node 該函式計算二叉樹中的乙個節點的最大貢獻值,具體而言,就是在以該節點為根節點的子樹中尋找以該節點為起點的一條路徑,使得該路徑上的節點值之和最大。具體而言,該函式的計算如下。空節點的最大貢獻值等於 0。非空節...

二叉樹最大路徑和 python 二叉樹最大路徑和

1.題目描述 輸入乙個二叉樹層次遍歷的結果,輸出這個二叉樹最大路徑和。路徑不一定從根節點開始和葉子節點結束。只要是連續的路徑就可以。如輸入 10,9,20,null,null,15,7 109 20 15 7 輸出 42 2.首先將乙個陣列還原成乙個二叉樹。然後根絕二叉樹的根節點返回最大路徑和。cl...

二叉樹最大路徑之和

binary tree maximum path sum 解題思路 這道題是求樹的路徑和的題目,不過和平常不同的是這裡的路徑不僅可以從根到某乙個結點,而且路徑可以從左子樹某乙個結點,然後到達右子樹的結點,就像題目中所說的可以起始和終結於任何結點。在這裡樹沒有被看成有向圖,而是被當成無向圖來尋找路徑。...