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

JS中DepthFirstInOrder递归遍历测试失败,无法正确输出节点值

二叉树中序遍历方法实现问题

我在BinaryTree类中实现了递归的深度优先中序遍历方法traverseDepthFirstInOrder,但不清楚该在哪里添加当前节点的处理逻辑,才能让测试代码正确获取左右子节点的值。试了所有可能的位置都没成功,调试时只能拿到值或者[Function (anonymous)]。

方法代码:

traverseDepthFirstInOrder(fn) {
    //handle left child (if exists)
    if (this.left) {
        this.left.traverseDepthFirstInOrder(fn);
    }
    //handle right child (if exists)
    if (this.right) {
        this.right.traverseDepthFirstInOrder(fn);
    }
}

测试代码:

test("should call the fn on left nodes, center nodes, then right nodes", () => {
    let test = [];
    binaryTree.add(4);
    binaryTree.add(14);
    binaryTree.add(6);
    binaryTree.add(16);
    binaryTree.add(2);
    binaryTree.add(12);
    binaryTree.traverseDepthFirstInOrder(e => test.push(e.value));
    expect(test).toEqual([2, 4, 6, 10, 12, 14, 16]);
});

终端报错:

  • Expected - 9
    • Received + 1

解决方案

中序遍历的核心顺序是左子树 → 当前节点 → 右子树,你现在的代码只递归处理了左右子树,完全漏掉了当前节点的回调调用。正确的做法是在处理完左子树之后,调用fn(this)把当前节点传给回调函数,再去处理右子树。

修正后的代码:

traverseDepthFirstInOrder(fn) {
    // 先处理左子树
    if (this.left) {
        this.left.traverseDepthFirstInOrder(fn);
    }
    // 处理当前节点,将节点对象传给回调
    fn(this);
    // 最后处理右子树
    if (this.right) {
        this.right.traverseDepthFirstInOrder(fn);
    }
}

这样调整后,测试代码里的回调e => test.push(e.value)就能正确拿到每个节点的value,最终test数组的顺序会符合中序遍历的预期。另外注意测试预期里的10,你添加的节点中并没有这个值,可能是测试用例的笔误,需要对应调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:31:20