[leetcode] BinaryTreeMaximumPathSum

Binary Tree Maximum Path Sum

  • 题意:从二叉树的任意一个起点出发,到另一个点所经过的路径和最大。注意,这里的路径就包含了一个点最多只能经过一次。
  • 分析:我们最大路径一定是要路过某些点的(不支持路径长度为0)。我们的路径都可以抽象成如下所示的路径。左边的长度和右边的长度都可以为0。所以我们就是要计算所有类似路径的长度之和。
  • 按照上面的思路,我们已经将问题转化成了所有类似这种形状路径中的最大值。
  • 那么我们怎么计算这种路径的最大值呢?
  • 对于我们的每个节点来说,他所能产生的路径长度就是以左孩子为根结点的单边路径最大值+以右孩子为跟节点的单边路径最大值+当前节点的value。注意左子树或者右子树中的最大值必须大于等于0.因为我们可以选择不要左子树,从该节点开始。
  • 什么是单边路径?就是类似我们图中用括号扩起来的部分。就是不能有转折,因为有转折的话就不能向上再走了,否则会有重复路径。
  • 那么如何计算左孩子为跟节点的单边路径最大值呢?
  • 我们最终返回的结果就是所有路径长度中的最大值。
  • 伪代码
    • MaxPathSumBase
    • 输入:根节点root, res=-INF
    • 输出包含根节点的单边路径最大值
    • 如果根节点为NULL,返回0
    • 计算左子树的最大值 LMax = max(0, LMax)
    • 计算右子树的最大值 RMax = max(0, RMax)
    • 计算包含本节点的值类似倒V型的路径中的最大值。res = max(res, LMax + RMax + root->value)
    • 返回当前子树的形成的单边的最大路径。max(LMax, RMax) + root->value
  • 代码:
int maxPathSumBase(TreeNode* root, int& res){
        if(root == NULL)
            return 0;
        int leftSum = max(0, maxPathSumBase(root->left, res)); // 如果左子树的和小于0, 则忽略不计
        int rightSum = max(0, maxPathSumBase(root->right, res)); // 如果右子树的和小于0, 则忽略不计
        res = max(res, leftSum + rightSum + root->val); // 结果左子树+右子树+root 因为左子树和右子树>=0;
        return max(leftSum, rightSum) + root->val;  // 如果结果在上面,则肯定需要加入root节点的value。

    }
    int maxPathSum(TreeNode* root) {
        int res = 0x7FFFFFF;
        res = -res - 1;
        cout<<res<<endl;
        maxPathSumBase(root, res);
        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值