LeetCode之Binary Tree Maximum Path Sum

题目:

Given a binary tree, find the maximum path sum.

For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path does not need to go through the root.

理解:在二叉树中找一条最大sum的路径,而该路径的两头可以是任意的节点,不一定是root。要是经过root的最大path很简单,但现在是任意两点的path啊,只好画个图分析分析了,如下图所示:

我这里给每个节点加上两个信息,第一个是可以往上传递的最大sum,也就是这个sum的产生肯定是一条直的path,这个sum>=node->val,第二个信息是以当前节点为根节点时能得到的最大sum,这里允许path可以拐弯,显然第二个数是大于等于第一个数,最后返回根节点的第二个数就行。

首先对于叶结点,两个数肯定都等于节点的value,而对于非叶结点,找出最大子节点的第一个数a,假如a大于0,那么当前节点的第一个数就等于value+a,否则就等于value,而对于第二个数就,首先求得当前节点的value+大于0的子节点的第一个数,假设这个结果为b,然后b与子节点的第二个数比较,得到最大的一个数就等于当前的第二个数了。语言描述得可能有点混乱,下面直接上代码吧。

class Solution {
public:
    void maxPathSum(TreeNode* root,int& leafNum,int& maxNum){
        if(!root->left&&!root->right){
            leafNum=root->val;
            maxNum=root->val;
            return;
        }
        int leftLeaf=INT_MIN,leftMax=INT_MIN;
        if(root->left){
            maxPathSum(root->left,leftLeaf,leftMax);
        }
        int rightLeaf=INT_MIN,rightMax=INT_MIN;
        if(root->right){
            maxPathSum(root->right,rightLeaf,rightMax);
        }
        int childLeaf=leftLeaf>rightLeaf?leftLeaf:rightLeaf;
        leafNum=root->val;
        if(childLeaf>0)
            leafNum+=childLeaf;
        int childMax=leftMax>rightMax?leftMax:rightMax;
        int sum=root->val;
        if(leftLeaf>0)
            sum+=leftLeaf;
        if(rightLeaf>0)
            sum+=rightLeaf;
        if(sum>childMax)
            maxNum=sum;
        else
            maxNum=childMax;
        return;
    }
    int maxPathSum(TreeNode* root) {
        if(!root)
            return 0;
        int leafNum=0,maxNum=0;
        maxPathSum(root,leafNum,maxNum);
        return maxNum;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值