day18 二叉樹中的最大路徑和

2021-10-07 07:49:59 字數 3153 閱讀 2371

沒看懂題目什麼意思,先從群裡大佬那裡偷來個思路研究研究

借鑑地對於二叉樹的問題,可以將其抽象成一種簡單的結構,即:

/ \

左子樹 右子樹

對於這道題目同樣如此,題目要求任意節點出發到達任意節點的最大路徑和。根據上面抽象出來的結果,我們最多能夠得到三條滿足題意的路徑:

不過需要注意的一點是,如果左右子樹的最大路徑和是負數,那麼還不如不加他們呢。

對於第一種和第二種情況,都可以通過遞迴進行計算,但是第三種情況,我們是沒辦法進行遞迴的,所以在每次的方法體中,都要對其進行一次判斷。

為什麼不能劃分出單獨的左子樹、右子樹、根節點這樣的路徑呢?這是因為:

我們給出的樹是乙個抽象出來的樹,它是遞迴的,實際上執行的時候我們可以通過後序遍歷,會先計算出左右子樹上最大路徑和,單獨的左右子樹的可能在遞迴的時候已經被計算到了,所以就不需要再考慮

而對於根節點而言,如果左右子樹的最大路徑和不為負數,那當然要加它們了,必然比自己大,而如果左右子樹的最大路徑和為負數,那麼就不會加它們,也就相當於單獨的根節點了。

以上是大致思路。

進入**編寫環節,首先要明確我們是要用遞迴來做這道題目的,然後就要進行遞迴三部曲。

是先要明確,我們的遞迴函式是要用來求子樹+根節點的最大路徑和,所以返回值應該是乙個int型別的變數。而傳入引數只需要乙個root即可。

所以函式簽名可以確定好了:int maxpath(treenode)

我們在遞迴的時候要做什麼呢?

首先要進行乙個後序遍歷,即求出左右子樹的最大路徑和,就需要遞迴的呼叫本函式。

int left = maxpath(root.left);

int right = maxpath(root.right);

left和right就是左右子樹的最大路徑和。

這個明確了以後就可以計算 根 + 左子樹 和 根 + 右子樹中的最大路徑和了。

只不過有一點需要注意,當左右子樹的值為負數的情況下,要捨棄掉它們。

int maxchildval = root.val +math.max(0, math.max(left,right));

這個maxchildval就是當前樹的最大路徑和,之後要返回的就是它。

接下來計算 根節點 + 左子樹 + 右子樹 的值,同樣葉是如果左右子樹最大路徑和小於0就不加它們,相當於+0了

int rootval = root.val + math.max(0, math.max(left,0)+ math.max(right,0));

接下來要看究竟哪個值才是當前遞迴樹的最大子樹和了

就要進行一次比較

int max = math.max(rootval,maxchildval)

max就是當前樹下的最大路徑和。不過這也只是區域性的,它在區域性最大並不代表在全域性最大呀,此時就需要定義乙個全域性變數res,它可以儲存全域性的最大路徑和。

res = math.max(res,max)

比較之前記錄好的最大路徑和,與當前的最大路徑和究竟誰大,然後儲存大的那個。

最後比較結束,返回maxchildval

本題的終止條件很簡單,就是遞迴到了最後的空結點。

if(root == null) retrun 0;

時間複雜度:該演算法將所有的結點都遍歷到了,時間複雜度為o(n)

空間複雜度:我們需要乙個大小與樹等高的棧開銷,因為要遞迴。所以空間複雜度為o(log(n))

下面是詳細**

/**

* definition for a binary tree node.

* public class treenode

* }*/// 對於一棵樹而言,它的最大路徑和有三種可能。一顆無論多大的樹可以看作是這樣的抽象

// a

// /\

// b c

// 可能是a + b + c

// 可能是a + b + (a父節點)

// 可能是a + b + (a父節點)

// 對於 a + b + c 而言,它不能夠被遞迴,已經是最終值了。

// 對於 a + b 或 a + c 而言,它還有可能更大 因為a也可能有乙個為正數的父節點,因此我們可以遞迴求最大的左右子樹。

// 對於a + b 、 a + c 、 a + b + c這三者,我們要比較一下究竟誰最大,最大者就是當前樹的環境下的最大者。如果還有父節點就繼續遞迴求解。

// 不過可能會存在負值,加乙個負值還不如不加,所以判斷是否比0小,如果小這個值就取0。

// 但是對於a點而言,它是不允許被捨棄的,因為無論那種情況下,都需要它作為聯絡點。

class

solution

intmaxpath

(treenode root)

int left =

maxpath

(root.left)

;int right =

maxpath

(root.right)

;// 先求出要返回的子樹值,即a + b 和 a + c兩者最大值,當然,如果雙方都小於0,那麼就返回乙個0表示路徑不會包括這棵子樹的節點。

int maxchildval = root.val +math.

max(

0, math.

max(left,right));

// 這是a + b + c 的值

int rootval = root.val + math.

max(

0, math.

max(left,0)

+ math.

max(right,0)

);// 比較雙方的大小,取大者與返回值比較。

res = math.

max(res,math.

max(rootval,maxchildval));

return maxchildval;

}}

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

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

二叉樹最大路徑和

每個節點不可以重複經過求,求二叉樹的最大路徑和。二叉樹如圖 本文採用深度優先演算法解題。假設每個節點都有兩個屬性,s stop c continue s屬性為,該節點及其以下節點的不停止走法最大值。c屬性為在還有路可走的情況下的最大值。舉例說明 node4節點,有兩條路可走 路線一和路線二 路線一意...

二叉樹中的最大路徑和

給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3 輸出 6 示例 2 輸入 10,9,20,null,null,15,7 10 9 20 15 7 輸出 42最大路...