我试图了解BST插入算法的工作原理。我是递归地做的,但我对它为什么不能正常工作感到有点困惑。
public boolean insert(int key) {
return insertHelper(root, key);
}
private boolean insertHelper(TreeNode sub, int key) {
if (sub == null) {
sub = new TreeNode(key);
return true;
} else if (sub.getData() > key) {
return insertHelper(sub.getLeftChild(), key);
} else
return insertHelper(sub.getRightChild(), key);
}
TreeNode构造函数
public TreeNode(int data) {
this.data = data;
}
问题是当我遍历树来打印元素时,树一直是空的。插入算法一定存在问题。
答案 0 :(得分:1)
因为您没有在代码的任何部分设置任何左右孩子。实现insertHelper以返回TreeNode而不是布尔值的最佳技术。此代码段可能会有所帮助。
private Node<T> insert(Node<T> p, T toInsert){
if (p == null)
return new Node<T>(toInsert);
if (compare(toInsert, p.data) == 0)
return p;
if (compare(toInsert, p.data) < 0)
p.left = insert(p.left, toInsert);
else
p.right = insert(p.right, toInsert);
return p;
}
答案 1 :(得分:1)
它仍为空,因为您的根始终为null
。
在java中,所有参数都按值传递。 所以这段代码:
// ....
if (sub == null) {
sub = new TreeNode(key);
return true;
//....
将创建新节点,但不会更新root。