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;
}