GFG叶节点同层判断题Java代码仅过8/600用例问题排查
GFG「叶节点处于同一层级」题解代码错误排查
你的解题思路方向是正确的:收集所有叶节点的层级,再校验所有层级值是否一致,就能得到正确结果。但代码实现存在3个明确问题,导致几乎无法通过测试用例:
- 核心逻辑缺失:
check方法中从未调用你编写的递归遍历方法che
你在check方法里新建了空的ArrayList后,直接遍历空列表做校验,全程没有执行二叉树遍历、叶节点层级收集的步骤,空列表遍历完会直接返回true,等于对所有输入都无判断直接返回结果,自然只能通过极少数恰好符合返回true的巧合用例。 - 存在无效冗余代码
check方法中定义的int c = 0变量全程没有被调用,属于无意义的冗余代码,不影响运行但属于书写疏漏。 - 包装类比较存在隐患
代码中用!=直接比较Integer包装类型对象,虽然层级数值较小的时候会被Java常量池缓存覆盖,不会触发问题,但如果遇到层级较大的场景,会出现值相等但引用不等的判断错误,规范写法应该直接用基本int类型接收值做比较,或者用equals方法判断。
修正后可通过的完整代码
补全递归方法调用、清理冗余代码后的实现如下:
class Solution { boolean check(Node root) { ArrayList<Integer> leafLevels = new ArrayList<>(); // 启动递归遍历,根节点初始层级设为1,收集所有叶节点层级 che(root, 1, leafLevels); // 校验所有叶节点层级是否一致 int standardLevel = leafLevels.get(0); for (int curLevel : leafLevels) { if (curLevel != standardLevel) { return false; } } return true; } private void che(Node root, int level, ArrayList<Integer> leafLevels) { if (root == null) { return; } // 命中叶节点,记录层级 if (root.left == null && root.right == null) { leafLevels.add(level); return; } // 递归遍历左右子树 che(root.left, level + 1, leafLevels); che(root.right, level + 1, leafLevels); } }
额外优化提示:实际解题时不需要等收集完全部叶节点再做校验,可以在遍历过程中记录第一个叶节点的层级,后续只要发现层级不匹配的叶节点就直接终止递归返回false,能减少不必要的遍历开销,提升运行效率。
内容的提问来源于stack exchange,提问作者Lostmymind
相关产品推荐
相关产品推荐

