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

递归有界中序遍历代码失效排查及实现疑问求助

递归有界中序遍历问题修复

原代码存在的问题

  1. 辅助递归方法未接收当前节点参数,无法递归遍历子树,逻辑完全无法推进
  2. 直接访问node.getLeftChild().getData(),未先判断子节点是否为空,会触发空指针异常
  3. 中序遍历的核心顺序(左→根→右)完全混乱,且递归调用时未传递当前节点的子节点
  4. 右子树的范围判断错误使用了||,应该用&&来判断是否在上下界内
  5. 未先校验当前节点是否在范围内就调用consumer,导致不符合条件的节点被错误处理

修复后的完整实现

// 对外暴露的方法,使用根节点、指定上下界和Consumer
public void boundedInorderTraverse(T lowerBound, T upperBound, Consumer<T> consumer) {
    boundedInorderTraverse(getRootNode(), lowerBound, upperBound, consumer);
}

// 辅助递归方法,接收当前节点、上下界和Consumer
private void boundedInorderTraverse(BinaryNode<T> currentNode, T lowerBound, T upperBound, Consumer<T> consumer) {
    if (currentNode == null) {
        return;
    }

    T currentData = currentNode.getData();
    int compareLower = currentData.compareTo(lowerBound);
    int compareUpper = currentData.compareTo(upperBound);

    // 利用二叉搜索树特性优化:如果当前节点值小于下界,左子树所有节点都更小,无需遍历左子树
    if (compareLower >= 0) {
        boundedInorderTraverse(currentNode.getLeftChild(), lowerBound, upperBound, consumer);
    }

    // 仅当当前节点在上下界范围内时,调用Consumer处理
    if (compareLower >= 0 && compareUpper <= 0) {
        consumer.accept(currentData);
    }

    // 利用二叉搜索树特性优化:如果当前节点值大于上界,右子树所有节点都更大,无需遍历右子树
    if (compareUpper <= 0) {
        boundedInorderTraverse(currentNode.getRightChild(), lowerBound, upperBound, consumer);
    }
}

关键逻辑说明

  • 辅助方法必须传入当前遍历节点,这是递归遍历的核心前提,否则无法逐层处理子树
  • 先判断当前节点是否为空,避免空指针异常
  • 基于二叉搜索树的特性做遍历优化(如果你的树不是BST,可以去掉优化逻辑,直接递归左右子树,然后判断当前节点是否在范围内)
  • 严格遵循中序遍历的顺序:先递归左子树,再处理当前节点(仅当符合范围),最后递归右子树
  • 每个节点仅在compareLower >=0 && compareUpper <=0时,才会被Consumer处理,确保只输出符合上下界要求的节点

测试验证

当下界为11、上界为64时,遍历二叉树会按预期顺序输出:[11, 21, 23, 24, 27, 41, 52, 53, 62, 64]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:10:30