You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 124.二叉树最大路径和:单负节点测试用例错误排查

解决LeetCode 124题:二叉树最大路径和的单负节点问题

错误原因分析

你之前的代码用max(0, 递归结果)来排除负节点贡献,同时全局最大路径和可能初始化为0,这就导致单个负节点的场景下,递归返回0,全局最大取0而非节点本身的负值,不符合预期。

核心修改方案

1. 调整递归返回逻辑

递归函数要返回以当前节点为起点向下延伸的最大路径和,这个值允许为负数(当当前节点本身是负数且左右子树贡献都为负时,只能选当前节点)。所以不能直接和0取最大,而是返回当前节点值 + max(左右子树贡献, 0)——这里加0的意思是,如果子树贡献为负,就不选该子树,只保留当前节点。

2. 修正全局最大初始值

不能把全局最大初始化为0,因为当所有节点都是负数时,最大路径和就是最大的那个负数。正确做法是将全局最大初始化为根节点的值,或者Integer.MIN_VALUE,再在递归中更新。

修正后的Java代码

class Solution {
    private int maxSum;

    public int maxPathSum(TreeNode root) {
        maxSum = root.val; // 初始化为根节点值,覆盖单负节点场景
        dfs(root);
        return maxSum;
    }

    private int dfs(TreeNode node) {
        if (node == null) {
            return 0; // 空节点贡献为0
        }

        // 计算左右子树的有效贡献,负贡献直接取0(不选该子树)
        int leftContribution = Math.max(dfs(node.left), 0);
        int rightContribution = Math.max(dfs(node.right), 0);

        // 更新全局最大路径和:当前节点作为路径顶点的总和
        int currentPathSum = node.val + leftContribution + rightContribution;
        maxSum = Math.max(maxSum, currentPathSum);

        // 返回当前节点能向上提供的最大贡献(只能选左或右子树的一条路径)
        return node.val + Math.max(leftContribution, rightContribution);
    }
}

代码说明

  • 单个-3节点场景:dfs(-3)中左右贡献都是0,currentPathSum = -3 + 0 + 0 = -3,maxSum初始为-3,最终返回-3,符合预期。
  • 混合节点场景:leftContribution和rightContribution会自动过滤负贡献的子树,全局最大会正确记录所有可能的路径和。

内容的提问来源于stack exchange,提问作者Rohan Madiratta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:57:40