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.

分析:这道题的难点在于路径可以是任意路径而不限于从根开始。解决这个问题我们可以从分解问题和分类讨论入手。对于一个二叉树,其maximum path或者包含root,或者不包含root,这点是解决问题的关键。如果maximum path不包含root,那么这个问题就分解成求左右两个子树的maximum path sum,然后取大的。如果maximum path包含root,我们在计算maximum path sum时需要知道包含左子树中包含root->left的maximum path sum(这里用left_sum表示)和右子树中包含root->right的maximum path sum(用right_sum表示)。我们用maxsum表示题目要求的maximum path sum,如果left_sum和right_sum均小于等于0,那么maxsum = max(maxsum, root->val);否则maxsum取当前maxsum、left_sum+root->val, right_sum+root->val, left_sum+root->val+right_sum的最大值。至此,这道题就可以解决了。代码如下:

class Solution {
public:
    int maxPathSum(TreeNode *root) {
        int max_sum = INT_MIN;
        max_path(root, max_sum);
        return max_sum;
    }
    
    int max_path(TreeNode * root, int & max_sum){
        if(root == NULL) return 0;
        
        int l = max_path(root->left, max_sum);
        int r = max_path(root->right, max_sum);
        int sum = root->val;
        
        if(l > 0) sum += l;
        if(r > 0) sum += r;
        
        max_sum = max(max_sum,sum);
        
        return max(l,r)>0?max(l,r) + root->val:root->val;
    }
};

 

posted on 2014-12-08 12:46  Ryan-Xing  阅读(172)  评论(0编辑  收藏  举报