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
相关产品推荐
相关产品推荐

