路徑: 被定義為一條從樹中任意節點出發,沿父節點-子節點連線,達到任意節點的序列。同乙個節點在一條路徑序列中至多出現一次 。該路徑 至少包含乙個 節點,且不一定經過根節點。
路徑和: 是路徑中各節點值的總和。
題目要求:給你乙個二叉樹的根節點 root ,返回其最大路徑和 。
示例 1:
輸入:root = [1,2,3]
輸出:6
解釋:最優路徑是 2 -> 1 -> 3 ,路徑和為 2 + 1 + 3 = 6
示例 2:
輸入:root = [-10,9,20,null,null,15,7]
輸出:42
解釋:最優路徑是 15 -> 20 -> 7 ,路徑和為 15 + 20 + 7 = 42
題解:
class
solution
public
intonesidemax
(treenode root)
}
分析:
ans計算當前節點的最大路徑和
onesidemax則可以選擇出兩條邊(兩個子樹)中有更大路徑和的那乙個,即從葉子選擇1還是選擇2走到目的節點。
思路:採用後序遍歷的想法
先計算出左子樹中已經選擇出的最大一條邊的路徑和(onesidemax),再接著是右子樹,最後加上根的值(root.val)就是最大路徑和。
比如示例二,按照我們的解題思路是:
自底向下,因為是後序遍歷。
1.從9開始,因為它是葉子節點,容易算出其ans為9;return 0+9,代表從這裡往上面走(-10)最大路徑是9;
2.(-10)左子樹遍歷完,接著是右子樹。
從15開始,和第一步類似,可知當前節點的路徑和ans變成了15,所以最大值更新為15
3.從7開始,當前節點路徑和為7比15小,不更新。
4.此時對於20,15,7這個子樹來說,從左邊只有一條 路15,右邊也只有一條路7,所以這個樹的最大路徑和為15+7+20=42
5.到這裡呼叫還沒有結束,注意理解每一層次的呼叫,不要搞亂了順序。
對於-10為根的這棵樹,前面已經知道左邊的路只有一條,現在要考慮右邊走哪一條,此時就可以體會到onesidemax的作用, 顯而易見走20->15這一條,則完整路徑是9->-10->20->15,其路徑和卻為34比42小,終得最大值是42.
對於整個過程,就像是在拼圖一樣,從最下面的葉子節點開始,一層一層往上拼,左右子樹選擇大的路徑的邊,比較一下子樹的最大路徑,慢慢更新,直到最終變成乙個大樹。
124 二叉樹中的最大路徑和
給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3 輸出 6示例 2 輸入 10,9,20,null,null,15,7 10 9 20 15 7 輸出 42思路 二...
124 二叉樹中的最大路徑和
給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3 輸出 6示例 2 輸入 10,9,20,null,null,15,7 10 9 20 15 7 輸出 42思路 對...
124 二叉樹中的最大路徑和
題目 給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。示例 1 輸入 1,2,3 1 2 3輸出 6 示例 2 輸入 10,9,20,null,null,15,7 10 9 20 15 7 沒看題解獨自...