思路
c++,动态规划,递归。
树形dp。
官方题解:
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-leetcode-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
首先,考虑实现一个简化的函数 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(15,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 {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* 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 {
public:
int res=INF;
int maxPathSum(TreeNode*root){
maxDe(root);
return res;
}
int maxDe(TreeNode* root) {
if(root==NULL){
return 0;
}
int leftGet=max(maxDe(root->left),0);
int rightGet=max(maxDe(root->right),0);
int maxVal=root->val;
if(leftGet>0){
maxVal+=leftGet;
}
if(rightGet>0){
maxVal+=rightGet;
}
res=max(maxVal,res);
return max(root->val+leftGet,root->val+rightGet);
}
};