題目:
給定乙個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。
剛看到題目就先入為主的以為最大路徑和不是在左邊就是在右邊,然後用遞迴實現求單邊分支最大值,方法 如下:
// 該方法求解的是當前節點加上左分支 【或】 右分支的最大路徑和。
public
intonesidemax
(treenode root)
// 左分支上的最大路徑和,注意這裡要和0比較,如果小於0的則可以捨棄。
int left = math.
max(
onesidemax
(root.left),0
);// 右分支上的最大路徑和
int right = math.
max(
onesidemax
(root.right),0
);return math.
max(left, right)
+ root.val;
}
但是跑了用例後,發現錯誤了。主要原因是最大路徑和還有可能出現在左分支加右分支加當前節點上。
故加入對這種情況的處理,這種情況可以在上面的遞迴中處理。 具體**如下:
int ans = integer.min_value;
// 用於記錄最大路徑和
public
intonesidemax
(treenode root)
// 左分支上的最大路徑和,注意這裡要和0比較
int left = math.
max(
onesidemax
(root.left),0
);// 右分支上的最大路徑和
int right = math.
max(
onesidemax
(root.right),0
);// 最關鍵的兩步
// 在遞迴過程中,不斷比較左右分支加上當前節點的路徑和
int newpath = left + right + root.val;
// 同已知的最大路徑比較
ans = math.
max(ans, newpath)
;// 注意方法的定義是求單邊的和。
return math.
max(left, right)
+ root.val;
}
這種方法的思想是在不斷遞迴的過程中調整目標值,遞迴的方法可能不是直接計算結果的,但是結果可以在這個遞迴的過程中計算。
在上述onesidemax方法執行結束後,ans即是最大的路徑和。
二叉樹最大路徑和 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最大路...