我正在用通用类在Java中编写一个二进制搜索树,但是节点未正确添加,因此我不知道为什么。
这是我的插入方法(迭代):
public void insert (E element){
//iterative insert element to tree
Node<E> node = new Node<>(element); //create new node for element
Node<E> current = root;
if (root == null) root = node; // if no root, new node is the root
else {
while (current != null){ //traverse tree to get to correct parent node
if (element.compareTo(current.data) < 0) { //case 1: node is smaller than current
if (current.left == null){
node.parent = current;
current.left = node;
}
else {
current = current.left;
}
}
else if (element.compareTo(current.data) > 0) { //case 2: node is larger than current
if (current.right == null){
node.parent = current;
current.right = node;
}
else {
current = current.right;
}
}
else { //case 3: node already exists
throw new RuntimeException("Node already exists");
}
}
}
size++;
}
当我运行测试类时,就会发生问题。在那里,第一个节点被添加并成为根节点,但是无论其值是多少,之后的下一个插入都会引发异常。它的行为就像我要添加的值已经存在于树中。如果我注释掉该异常,则测试类不会编译,就好像它在运行无限循环一样。
我在这里做错了什么?
在while循环中电流将如何变为空?
即使插入新元素,您也不会从while循环中跳出来:
if (current.left == null) {
node.parent = current;
current.left = node;
}
在下一次迭代中,您将分配current
给您刚刚插入的值current.left
:
} else {
current = current.left;
}
但在下一次迭代中,您现在current.data
等于element
,这会导致异常。break;
插入元素后添加:
if (current.left == null) {
node.parent = current;
current.left = node;
break;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句