题目:

给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)

样例:

给出一棵二叉树:{1,2,3}
clipboard.png
返回 6

思路:

指定某个节点为根时,一条经过root的最大路径,这条路径可能是: 1) 左边某条路径 + root + 右边某条路径
(左右子树的路径加上当前节点) 2) 左边某条路径 + root (左子树的路径加上当前节点) 3) root + 右边某条路径
(右子树的路径加上当前节点) 4) root
然而这四种情况只是用来计算以当前节点根的最大路径,如果当前节点上面还有节点,那它的父节点是不能累加第1种情况的。
所以要保存两个最大值,一个是当前节点下最大路径和maxCurrent(没有父节点),另一个是如果要连接父节点时最大的路径和maxSum。

参考答案:

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution {
public:
    /*
     * @param root: The root of binary tree.
     * @return: An integer
     */
    int res = -1000000;
    int maxPathSum(TreeNode * root) {
        // write your code here
        helper(root);
        return res;
        
    }
    
    int helper(TreeNode * root)
    {
        if(root == NULL) return 0;
        int left = helper(root->left);
        int right = helper(root->right);
        
        int maxSum = max(max(left+root->val, right+root->val), root->val);
        int maxCurrent = max(maxSum, root->val+left+right);
        //cout<<maxSum<<endl;
        res = max(res,maxCurrent);
        return maxSum;//注意返回的是maxSum
    }
};

wydong
40 声望5 粉丝

wyd