BST插入与中序遍历无输出问题排查:我的代码为何失效?
BST插入无输出的原因及代码差异分析
核心问题:根节点未被正确更新
你的代码无输出的根本原因是二叉树的根节点始终为null。
在main方法中,调用b.Binsert(b.Root, 6)时,虽然Binsert方法在根节点为null时会创建新的Node并返回,但你没有把这个返回值赋值给b.Root。后续所有插入操作都基于初始的null根节点执行,最终树仍为空,中序遍历自然没有输出。
与网上代码的关键差异
1. 插入逻辑的封装与根节点更新
- 你的代码:
Binsert方法需要手动传递根节点,且必须接收返回值来更新根节点,但你未执行这一步。正确的调用方式应为:b.Root = b.Binsert(b.Root, 6); - 网上代码:封装了一层
insert(int newData)方法,内部自动将递归insert的返回值赋值给this.root,确保根节点被正确更新,无需手动处理返回值。
2. 方法的易用性设计
- 你的代码的中序遍历方法
Inoder(注意拼写错误,应为Inorder)需要手动传递根节点;网上代码提供了无参数的inorder()方法,内部自动使用类的根节点,避免了传递错误。 - 变量命名:你的根节点是
Root(大写开头),网上代码是root(小写开头),这只是命名规范差异,不影响功能。
3. 输出格式(非无输出原因)
- 你的中序遍历用
System.out.println逐个换行输出;网上代码用System.out.print加空格,元素在同一行输出,这只是展示形式不同。
修复后的代码示例
修改main方法中的插入调用,将返回值赋值给b.Root:
class Bst { Node Root; Bst(){ this.Root = null; } static class Node{ int data; Node left,right; Node(int data){ this.data = data; this.left = null; this.right = null; } } Node Binsert(Node root, int a){ if(root == null){ root = new Node(a); return root; } else if(root.data >= a){ root.left = Binsert(root.left, a); } else{ root.right = Binsert(root.right, a); } return root; } void Inorder(Node root){ // 修正拼写错误 if (root != null) { Inorder(root.left); System.out.println(root.data); Inorder(root.right); } } public static void main(String[] args) { Bst b = new Bst(); // 关键:将返回值赋值给Root,更新根节点 b.Root = b.Binsert(b.Root, 6); b.Root = b.Binsert(b.Root, 3); b.Root = b.Binsert(b.Root, 5); b.Root = b.Binsert(b.Root, 7); b.Root = b.Binsert(b.Root, 1); b.Root = b.Binsert(b.Root, 2); b.Root = b.Binsert(b.Root, 4); b.Root = b.Binsert(b.Root, 8); b.Root = b.Binsert(b.Root, 9); b.Inorder(b.Root); } }
或者像网上代码一样封装插入方法,避免手动赋值:
// 新增封装方法 void Binsert(int a){ this.Root = Binsert(this.Root, a); } // main方法中直接调用 b.Binsert(6); b.Binsert(3); // ... 其他插入操作
内容的提问来源于stack exchange,提问作者Ajam
相关产品推荐
相关产品推荐

