Given a binary tree, find the maximum path sum.
The path may start and end at any node in the tree.
For example:
Given the below binary tree,
1 / \ 2 3
Return 6
.
题目解析:
这道题目让求所有路径中最大的和。路径之间的点可以为任意结点,不一定非要经过根结点,那么问题就比较复杂了。maxPathSum返回的是整体的最大值,但如果递归的话,我们还想父节点和子节点递归的返回值相加,那么这两个就不是一个事物。我们得设计一个函数,返回值必须是一条路径,供父节点完成返回root->val / root->val+leftSum / root->val+rightSum 三者中的一个。而子节点中可能更新最大值,max(maxSum,root->val,leftSum+root->val,rightSum+root->val,leftSum+root->val+rightSum)这五个数据中的一个,选出最大值。本来还算上了单独的leftSum和rightSum。但其值已经在子孩子返回前已经更新。
还有一个很重要的地方:maxSum的初始值。可以设为INT_MIN。但递归到叶节点的时候,其左右子树为空,要返回0。我之前一直返回最小值INT_MIN,会造成严重的错误,当叶节点为负数的时候,INT_MIN+a为很大的正数。后来换成INT_MIN/2也不行,因为左右返回值会相加。直到换成INT_MIN/4才可以。不过很好的返回方法是0。但求最大值判断的时候,一定不能加上leftSum和rightSum,会造成新的错误。
class Solution {
public:
int maxPathSum(TreeNode *root) {
maxSum = INT_MIN/2;
FindSubPath(root);
return maxSum;
}
int FindSubPath(TreeNode *root){
if(root == NULL)
return 0;
int leftSum = FindSubPath(root->left);
int rightSum = FindSubPath(root->right);
maxSum = maxSum > root->val? maxSum : root->val;
maxSum = maxSum > leftSum+root->val? maxSum : leftSum+root->val;
maxSum = maxSum > rightSum+root->val? maxSum : rightSum+root->val;
maxSum = maxSum > leftSum+root->val+rightSum? maxSum : leftSum+root->val+rightSum;
int tmp;
tmp = root->val > root->val+leftSum ? root->val : root->val+leftSum;
tmp = tmp > root->val+rightSum ? tmp : root->val+rightSum;
return tmp;
}
private:
int maxSum;
};