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

题目来源:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/

大致题意:
给一个二叉树,若以父子关系为路径,在所有节点只能经过一次的情况下,所能经过的最大路径和

思路

对于叶节点来说,其最大路径和为其本身
对叶节点的父节点的子树来说,其最大路径为 max( max(左节点, 右节点, 0) + 节点值, 左节点 + 右节点 + 节点值)。并且若路径为后者 左节点 + 右节点 + 节点值,那么就不会再有该子树之外的节点可以添加进来,也就是只能在本子树中获得的最大路径和

于是,可以递归获取二叉数的最大路径和,当前子树对父节点的最大路径和贡献值即为

  • max(左子树的最大路径和, 右节点的最大路径和, 0) + 当前子树根节点值

同时,在遍历到每个子树时,维护一个最大值变量(即答案),其存当前左子树的最大路径和 + 右节点的最大路径和 + 当前子树根节点值中的最大值,即不能添加其它子树节点的路径,只能在本子树中获得的最大路径和

那么,最终的答案即为遍历中可以获得的最大值

class Solution {
    int ans;
    public int maxPathSum(TreeNode root) {
        // 最大路径和
        ans = Integer.MIN_VALUE;
        return Math.max(dfs(root), ans);
    }

    public int dfs(TreeNode node) {
        if (node == null) {
            return 0;
        }
        // 左子树的最大路径和
        int leftSum = dfs(node.left);
        // 右子树的最大路径和
        int rightSum = dfs(node.right);
        // 更新答案,leftSum + rightSum + node.val 为只能在本子树中获得的最大路径和
        ans = Math.max(leftSum + rightSum + node.val, ans);
        // 本子树对父节点的最大路径和贡献
        int curSum = Math.max(Math.max(leftSum, rightSum), 0) + node.val;
        // 更新答案
        ans = Math.max(curSum, ans);
        return curSum;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三更鬼

谢谢老板!

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

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

打赏作者

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

抵扣说明:

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

余额充值