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

LeetCode 1448:二叉树好节点计数解法错误排查求助

解决LeetCode 1448:二叉树好节点计数的DFS错误问题

你的核心逻辑完全偏离了题目要求,这才是导致所有测试用例输出0的根本原因:

  • 题目中好节点是单个节点的属性:只要从根到该节点的路径上没有比它值大的节点,这个节点就算好节点。每个节点的判定独立,和后续出现的更大节点无关。
  • 你错误地认为“遇到更大节点要重置之前的计数”,这相当于否定了之前所有节点的好节点资格,显然和题目定义矛盾——比如根节点一定是好节点,按你的逻辑如果后续有更大节点,根的计数会被清零,最终结果自然为0。

正确的DFS实现思路

用递归遍历每个节点,同时跟踪当前路径的最大值:

  • 递归函数传递两个参数:当前遍历的节点,以及当前路径(从根到当前节点父节点)的最大值。
  • 若当前节点值大于等于路径最大值,说明这是一个好节点,计数+1,并更新路径最大值为当前节点值;否则计数不变,最大值保持。
  • 递归累加左、右子树的好节点数量,最终返回总和。

修正后的Java代码

class Solution {
    public int goodNodes(TreeNode root) {
        // 初始路径最大值设为最小整数,确保根节点一定被计数
        return dfs(root, Integer.MIN_VALUE);
    }
    
    private int dfs(TreeNode node, int currentMax) {
        if (node == null) {
            return 0;
        }
        int currentCount = 0;
        // 判断当前节点是否为好节点
        if (node.val >= currentMax) {
            currentCount = 1;
            currentMax = node.val;
        }
        // 累加左右子树的好节点数
        currentCount += dfs(node.left, currentMax);
        currentCount += dfs(node.right, currentMax);
        return currentCount;
    }
}

关于全局变量的说明

如果一定要用全局变量,需要注意:

  • 全局变量要在每次调用goodNodes方法时初始化(比如设为0),否则多次测试用例运行会导致计数累加错误。
  • 但更推荐上面的递归传参方式,避免全局变量带来的副作用,代码也更简洁可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:22:35