【Leetcode】124. 二叉树中的最大路径和

题目描述

在这里插入图片描述

// 124. 二叉树中的最大路径和


// 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列
// 。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一
// 定经过根节点。

// 路径和 是路径中各节点值的总和。

// 给你一个二叉树的根节点 root ,返回其 最大路径和 。

// 定义答案保存位max。
// 定义函数pathSum(TreeNode node),计算以node作为根,其子树所能够
// 计算的路径和。之后我们层层递归下去,求每个结点node的pathSum,
// 并更新遍历到node节点时的最大路径和max,
// 如根结点的root的最大路径和是root.left和root.right路径和的叠加(保证root.
// left和root.right贡献的值不是负数),而root.left的最大路径和又是root.left
// .left和root.left.right的路径和的叠加(保证两子结点贡献值不是负数),以此
// 类推,我们都要更新给max。
// 我们先定义pathSum的递归终止条件,如果输入的node为null,返回0,说明
// 空结点贡献值为0。之后定义node的左子节点node.left的pathSum最大路径和,
// 记为leftPathSum,需要注意的数如果左子节点node.left的最大路径和是负数,
// 则直接截断置0,防止贡献值为负数。
// 然后再定义node的右子结点node.right的pathSum最大路径和,记为rightPathSum,
// 同样如果是负数贡献值,直接截断置0。
// 然后求当前遍历节点node的值node.val,和左子节点最大路径和leftPathSum,
// 和右子结点最大路径和rightPathSum的求和,拿来更新max(比max大就赋给max)。
// 所以每次调用pathSum遍历node节点的时候都会更新一次max。
// 最后pathSum函数返回当前值node.val和左子节点/右子结点路径最大和之中,最大
// 的那个求和,使得路径和只能向一个方向延伸。
// 
// 
// 执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:40.4 MB, 在所有 Java 提交中击败了54.24%的用户
class Solution {
    int max = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        pathSum(root);
        return max;
    }

    public int pathSum(TreeNode node) {
        if (node == null)
            return 0;
        int leftPathSum = Math.max(pathSum(node.left), 0);
        int rightPathSum = Math.max(pathSum(node.right), 0);
        max = Math.max(max, node.val + leftPathSum + rightPathSum);
        return node.val + Math.max(leftPathSum, rightPathSum);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锥栗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值