二叉树子树和为偶数节点打印 JS实现错误排查
代码问题分析
你当前的代码有两个核心错误,刚好对应你遇到的异常输出:
- 递归返回值缺失:
isEven函数仅在空节点时返回0,非空节点处理完成后没有返回当前子树的总和,导致上层节点计算left、right时拿到的是undefined,求和得到NaN,模2判断直接失效。只有叶子节点因为左右子节点都是空(返回0),计算逻辑暂时正常,所以你只会看到所有叶子节点的输出。 - 多余的顶层打印:你最后执行
console.log(isEven(a)),但isEven本身没有返回值,所以会额外打印一个undefined。
修正方案
- 补全递归返回值:非空节点处理完成后,返回当前子树的总和,供上层节点计算使用
- 移除顶层的
console.log包裹,直接调用递归函数即可 - (可选匹配你预期的输出)按照你提到的笔误,将f节点的数值修改为非2的值,避免额外输出2
修正后代码如下:
class Node { constructor(val) { this.val = val; this.left = null; this.right = null; } } const a = new Node(3); const b = new Node(11); const c = new Node(4); const d = new Node(4); const e = new Node(-2); const f = new Node(1); // 按笔误说明修改为1,避免输出2 a.left = b; a.right = c; b.left = d; b.right = e; c.right = f; // 3 // / \ // 11 4 // / \ \ // 4 -2 1 const printEvenSumNode = (node) => { if (node === null) return 0; const leftSum = printEvenSumNode(node.left); const rightSum = printEvenSumNode(node.right); const currentSubtreeSum = leftSum + rightSum + node.val; if (currentSubtreeSum % 2 === 0) { console.log(node.val); } return currentSubtreeSum; // 补全子树和返回 }; printEvenSumNode(a);
运行后输出为4、-2、4、3,是后序遍历的顺序,和你预期的节点值完全匹配。
内容的提问来源于stack exchange,提问作者CountChrisdo
相关产品推荐
相关产品推荐

