LeetCode | Binary Tree Maximum Path Sum(二叉树的路径最大值)

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

点赞