沒看懂題目什麼意思,先從群裡大佬那裡偷來個思路研究研究
借鑑地對於二叉樹的問題,可以將其抽象成一種簡單的結構,即:
根
/ \
左子樹 右子樹
對於這道題目同樣如此,題目要求任意節點出發到達任意節點的最大路徑和。根據上面抽象出來的結果,我們最多能夠得到三條滿足題意的路徑:
不過需要注意的一點是,如果左右子樹的最大路徑和是負數,那麼還不如不加他們呢。
對於第一種和第二種情況,都可以通過遞迴進行計算,但是第三種情況,我們是沒辦法進行遞迴的,所以在每次的方法體中,都要對其進行一次判斷。
為什麼不能劃分出單獨的左子樹、右子樹、根節點這樣的路徑呢?這是因為:
我們給出的樹是乙個抽象出來的樹,它是遞迴的,實際上執行的時候我們可以通過後序遍歷,會先計算出左右子樹上最大路徑和,單獨的左右子樹的可能在遞迴的時候已經被計算到了,所以就不需要再考慮
而對於根節點而言,如果左右子樹的最大路徑和不為負數,那當然要加它們了,必然比自己大,而如果左右子樹的最大路徑和為負數,那麼就不會加它們,也就相當於單獨的根節點了。
以上是大致思路。
進入**編寫環節,首先要明確我們是要用遞迴來做這道題目的,然後就要進行遞迴三部曲。
是先要明確,我們的遞迴函式是要用來求子樹+根節點的最大路徑和,所以返回值應該是乙個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最大路...