Leetcode 124. 二叉树中的最大路径和

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int ans;
    
    //以r为根的到任意节点的path sum
    int maxdeep(TreeNode* r)
    {
        if(r==NULL)
            return 0;
        
        if(r->left==NULL&&r->right==NULL)
        {
            // 修正是叶子节点时候的ans值
            // 叶子节点是没有左右子树的,因此就比较当前ans和叶子节点的大小就可以了。
            ans = max(ans, r->val);
            
            return r->val;
        }
        else
        {
            //左子树
            int maxleft = maxdeep(r->left);
            //右子树
            int maxright = maxdeep(r->right);
            
            // 当前节点的最大path sum 到根节点为止。
            int maxsum =  r->val + max(maxleft, maxright);
            // 仅仅包含当前节点的可能性, 这样就表示了从r节点到所有节点的path sum 而不仅仅是到根节点的path sum, 因为包含了为负数的情况。
            maxsum = max(maxsum, r->val);
            
            // 非叶子节点是有左右子树的,因此就比较两种方式,一种方式当前节点的path sum,另外一种是以当前节点为根节点的最大path sum。
            ans = max(ans, maxsum);
            ans = max(ans, maxleft+maxright+r->val);
            
            return maxsum;
        }
    }

    int maxPathSum(TreeNode* root) {
        // 最大负数
        ans = 0X80000000;
        int d = maxdeep(root);
        return ans;
    }
};

猜你喜欢

转载自www.cnblogs.com/randyniu/p/9227465.html