树-leetcode#124-二叉树的最大路径和

11 篇文章 0 订阅
class Solution {
public:
    int maxPathSum(TreeNode* root) {
        if(root==NULL) return 0;
        int sum = 0;
        int single = 0;
        path(root,sum,single);
        return sum;
    }
    void path(TreeNode * root,int & sum , int & single){
        if(root->left==NULL && root->right==NULL)
        {
            sum=root->val;
            single = root->val;
            return;
        }
        int left_sum = 0;
        int left_single = 0;
        int right_sum = 0;
        int right_single = 0;
        if(root->left) path(root->left,left_sum,left_single);
        if(root->right) path(root->right,right_sum,right_single);
        sum = root->val;
        single = root->val;
        if(root->left){
            single=max(left_single+root->val,single);
            sum = max(max(sum,single),left_sum);
        }
        if(root->right){
            single=max(right_single+root->val,single);
            sum = max(max(sum,single),right_sum);
            if(root->left)
                sum = max(sum,left_single+root->val+right_single);
        }
        return;
    }
};

二叉树的最大路径和,写了一个通过的,拿到一个根节点,需要比较,根,根+左孩子,根+右孩子,根+左孩子+右孩子,选出一个全局最大的,是作为当前根的最大路径和;这里有一个点,路径,要分析好,就是不能右分叉,比如去了左+根+右,那么递归返回时,上一层的根就不能和这个路径值相加了,因为那样就不是路径了,因此需要维护两个参数,sum和single,sum是当前可见的最大路径和,single是不同时包含左右子树的最大路径和,也就是{根,根+左,根+右}三种;同样在利用左右子树的返回值进行计算时,也要考虑到,与根相加不能使用孩子返回的sum,而只能使用孩子返回的single。但是在求sum时,需要考虑到只有左孩子和只有右孩子,这个相当于一个全局最大值。

需要处理太多参数了,对吗?优化版本,可以把max设成一个全局变量,single作为函数返回值。

class Solution {
public:
    int res=INT_MIN;
    int maxPathSum(TreeNode* root) {
        if(root==NULL) return 0;
        path(root);
        return res;
    }
    int path(TreeNode * root){
        if(root==NULL) return 0;
        int con1 = root->val;
        int left=path(root->left);
        int right=path(root->right);
        int con2 = root->val+left;
        int con3 = root->val+right;
        int con4 = root->val+left+right;
        res = max(res,max(max(con1,con2),max(con3,con4)));
        return max(con1,max(con2,con3));
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值