Binary Tree Maximum Path Sum
- 题意:从二叉树的任意一个起点出发,到另一个点所经过的路径和最大。注意,这里的路径就包含了一个点最多只能经过一次。
- 分析:我们最大路径一定是要路过某些点的(不支持路径长度为0)。我们的路径都可以抽象成如下所示的路径。左边的长度和右边的长度都可以为0。所以我们就是要计算所有类似路径的长度之和。

- 按照上面的思路,我们已经将问题转化成了所有类似这种形状路径中的最大值。
- 那么我们怎么计算这种路径的最大值呢?
- 对于我们的每个节点来说,他所能产生的路径长度就是以左孩子为根结点的单边路径最大值+以右孩子为跟节点的单边路径最大值+当前节点的value。注意左子树或者右子树中的最大值必须大于等于0.因为我们可以选择不要左子树,从该节点开始。
- 什么是单边路径?就是类似我们图中用括号扩起来的部分。就是不能有转折,因为有转折的话就不能向上再走了,否则会有重复路径。
- 那么如何计算左孩子为跟节点的单边路径最大值呢?
- 我们最终返回的结果就是所有路径长度中的最大值。
- 伪代码
- MaxPathSumBase
- 输入:根节点root, res=-INF
- 输出包含根节点的单边路径最大值
- 如果根节点为NULL,返回0
- 计算左子树的最大值 LMax = max(0, LMax)
- 计算右子树的最大值 RMax = max(0, RMax)
- 计算包含本节点的值类似倒V型的路径中的最大值。res = max(res, LMax + RMax + root->value)
- 返回当前子树的形成的单边的最大路径。max(LMax, RMax) + root->value
- 代码:
int maxPathSumBase(TreeNode* root, int& res){
if(root == NULL)
return 0;
int leftSum = max(0, maxPathSumBase(root->left, res));
int rightSum = max(0, maxPathSumBase(root->right, res));
res = max(res, leftSum + rightSum + root->val);
return max(leftSum, rightSum) + root->val;
}
int maxPathSum(TreeNode* root) {
int res = 0x7FFFFFF;
res = -res - 1;
cout<<res<<endl;
maxPathSumBase(root, res);
return res;
}