c++,動態規劃,遞迴。
樹形dp。
官方題解:
首先,考慮實現乙個簡化的函式 maxgain(node),該函式計算二叉樹中的乙個節點的最大貢獻值,具體而言,就是在以該節點為根節點的子樹中尋找以該節點為起點的一條路徑,使得該路徑上的節點值之和最大。
具體而言,該函式的計算如下。
空節點的最大貢獻值等於 0。
非空節點的最大貢獻值等於節點值與其子節點中的最大貢獻值之和(對於葉節點而言,最大貢獻值等於節點值)。
例如,考慮如下二叉樹。
-10/
9 20
/ 15 7
葉節點 99、15、77 的最大貢獻值分別為 99、15、77。
得到葉節點的最大貢獻值之後,再計算非葉節點的最大貢獻值。節點 20 的最大貢獻值等於 20
+max(
15,7)
=35
20+\max(15,7)=35
20+max(1
5,7)
=35,節點 -10 的最大貢獻值等於−10+
max(9
,35)=
25-10+\max(9,35)=25
−10+
max(9,
35)=
25。上述計算過程是遞迴的過程,因此,對根節點呼叫函式 maxgain,即可得到每個節點的最大貢獻值。
根據函式 maxgain 得到每個節點的最大貢獻值之後,如何得到二叉樹的最大路徑和?對於二叉樹中的乙個節點,該節點的最大路徑和取決於該節點的值與該節點的左右子節點的最大貢獻值,如果子節點的最大貢獻值為正,則計入該節點的最大路徑和,否則不計入該節點的最大路徑和。維護乙個全域性變數 maxsum 儲存最大路徑和,在遞迴過程中更新 maxsum 的值,最後得到的 maxsum 的值即為二叉樹中的最大路徑和。
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/const
int inf=
-0x3f3f3f3f
;class
solution
intmaxde
(treenode* root)
int leftget=
max(
maxde
(root-
>left),0
);int rightget=
max(
maxde
(root-
>right),0
);int maxval=root-
>val;
if(leftget>0)
if(rightget>0)
res=
max(maxval,res)
;return
max(root-
>val+leftget,root-
>val+rightget);}
};
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 沒看題解獨自...