修改B-Tree标准中序遍历实现逆序递归遍历不生效,如何排查问题?
问题核心原因
B树的单个节点如果存储了n个key,必然对应n+1个孩子节点,你当前的代码逻辑完全错误处理了最右侧孩子节点的遍历时机与下标:
- 你的for循环从
node.numNodes - 1递减到0,循环退出时i的值为-1,此时调用reversedInOrder(node.children[i])属于非法的负下标访问,不仅没有遍历到目标子节点,还会触发数组越界异常。 - 标准正序中序遍历的逻辑是从左到右:先遍历第i个左孩子,输出第i个key,循环结束后i刚好等于n(key的总数),对应最右侧孩子的下标,所以可以直接遍历
children[i]。但逆序遍历需要优先遍历最右侧的孩子节点,这一步你的逻辑完全遗漏了。
修正后的实现代码
private void reversedInOrder(BTreeNode node) { int i; // 逆序遍历要先访问最右侧的子节点(下标为node.numNodes) if (!node.isLeaf) { reversedInOrder(node.children[node.numNodes]); } // 再从右往左遍历key和对应的左方子节点 for (i = node.numNodes - 1; i >= 0; i--) { System.out.println(node.keys[i].getRedId()); if (!node.isLeaf) { reversedInOrder(node.children[i]); } } }
逻辑验证
逆序中序遍历B树的单节点执行顺序为:
- 递归遍历最右侧子节点
- 输出最右侧key
- 递归遍历最右侧key的左侧子节点
- 重复2、3步骤直到所有key遍历完成
最终输出结果就是从大到小排列的键值序列,符合逆序中序遍历的预期。
内容的提问来源于stack exchange,提问作者Luka Jozić
相关产品推荐
相关产品推荐

