递归有界中序遍历代码失效排查及实现疑问求助
递归有界中序遍历问题修复
原代码存在的问题
- 辅助递归方法未接收当前节点参数,无法递归遍历子树,逻辑完全无法推进
- 直接访问
node.getLeftChild().getData(),未先判断子节点是否为空,会触发空指针异常 - 中序遍历的核心顺序(左→根→右)完全混乱,且递归调用时未传递当前节点的子节点
- 右子树的范围判断错误使用了
||,应该用&&来判断是否在上下界内 - 未先校验当前节点是否在范围内就调用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
相关产品推荐
相关产品推荐

