首先,考慮實現乙個簡化的函式 maxgain(node),該函式計算二叉樹中的乙個節點的最大貢獻值,具體而言,就是在以該節點為根節點的子樹中尋找以該節點為起點的一條路徑,使得該路徑上的節點值之和最大。
具體而言,該函式的計算如下。
空節點的最大貢獻值等於 00。
非空節點的最大路徑和等於節點值與其子節點中的最大貢獻值之和(對於葉節點而言,最大貢獻值等於節點值)。
例如,考慮如下二叉樹。
-10/ \
9 20
/ \
15 7
葉節點 99、1515、77 的最大貢獻值分別為 99、1515、77。
得到葉節點的最大貢獻值之後,再計算非葉節點的最大貢獻值。節點 2020 的最大貢獻值等於 20+\max(15,7)=3520+max(15,7)=35,節點 -10−10 的最大貢獻值等於 -10+\max(9,35)=25−10+max(9,35)=25。
非空節點的最大貢獻值 = 節點值 + math.max(左節點的最大貢獻值,右節點的最大貢獻值)
上述計算過程是遞迴的過程,因此,對根節點呼叫函式 maxgain,即可得到每個節點的最大貢獻值。
根據函式 maxgain 得到每個節點的最大貢獻值之後,如何得到二叉樹的最大路徑和?對於二叉樹中的乙個節點,該節點的最大路徑和取決於該節點的值與該節點的左右子節點的最大貢獻值,如果子節點的最大貢獻值為正,則計入該節點的最大路徑和,否則不計入該節點的最大路徑和。維護乙個全域性變數 maxsum 儲存最大路徑和,在遞迴過程中更新 maxsum 的值,最後得到的 maxsum 的值即為二叉樹中的最大路徑和。
class solution
public int maxgain(treenode node)
// 遞迴計算左右子節點的最大貢獻值
// 只有在最大貢獻值大於 0 時,才會選取對應子節點
int leftgain = math.max(maxgain(node.left), 0);
int rightgain = math.max(maxgain(node.right), 0);
// 節點的最大路徑和取決於該節點的值與該節點的左右子節點的最大貢獻值
int pricenewpath = node.val + leftgain + rightgain;
// 更新答案
maxsum = math.max(maxsum, pricenewpath);
// 返回節點的最大貢獻值
return node.val + math.max(leftgain, rightgain);
}}
二叉樹最大路徑和 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最大路...