124. Binary Tree Maximum Path Sum的C++解法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musechipin/article/details/84940290

乍一看好像很简单,用递归分别求子树的最大路径加上根就好了,但实际题目要求路径可以以任意节点为起点(不一定要加上根)。

分析一下对于指定某个节点为根时,最大的路径和有可能是哪些情况。第一种是左子树的路径加上当前节点,第二种是右子树的路径加上当前节点,第三种是左右子树的路径加上当前节点(相当于一条横跨当前节点的路径),第四种是只有自己的路径。然而这四种情况只是用来计算以当前节点根的最大路径,如果当前节点上面还有节点,那它的父节点是不能累加第三种情况的。

所以递归值记录一、二、四(单路径)的最大值,因为只要是返回上一层递归就意味着上层肯定有其它节点,情况三不能计算在内。每回溯到此层根节点的时候,再另外算情况三的值,和已存在最大值比较即可。
比较好理解的代码:

class Solution {
public:
    int maxres=INT_MIN;
    int maxPathSum(TreeNode * root) {
        helper(root);
        return maxres;
    }
    int helper(TreeNode * root) {
        if(root == NULL) return 0;
        int left = helper(root->left);
        int right = helper(root->right);
        //单路径的最大值
        int currSum = max(max(left + root->val, right + root->val), root->val);
        //单路径和多路径的最大值
        int currMax = max(currSum, left + right + root->val);
        //更新
        maxres = max(currMax, maxres);
        //只返回单路径的共上一层根节点使用
        return currSum;
    } 
};

还有一个思路一样但是更快一点的代码:

class Solution {
public:
    int help(TreeNode* root, int &maxres){
        if (!root) return 0;
        int l=max(0, help(root->left, maxres));
        int r=max(0, help(root->right, maxres));
        maxres = max(maxres, root->val+l+r);
        return max(root->val, root->val+max(l, r));
    }
 
    int maxPathSum(TreeNode* root) {
        int maxres=INT_MIN;
        help(root, maxres);
        return maxres;
    }
};

有两点,一个是用max(0,A)直接排除和小于0的情况,一个是用int&代替了全局变量,加了引用的maxres是不随着递归层数的更新而重新初始化的,而是像一个全局变量一样一直不变。

猜你喜欢

转载自blog.csdn.net/musechipin/article/details/84940290