我为二叉搜索树编写了一个删除函数,该函数使用 while 循环导航到要删除的特定节点。然而,它永远不会到达那里 - 它只是迭代未知次数,然后给我一个NullPointerException。
我想知道这是否是我的遍历逻辑中的错误,但它与我的 add 函数完全相同,效果很好。
void remove(Comparable newObject){
if (!isEmpty()){
Node curr = new Node();
curr = root;
boolean isFound = false;
while (!isFound){
if (curr.data.compareTo(newObject) == 0){
if (curr.hasChildren()){
Node replaceNode = new Node();
if (curr.leftChild == null){
replaceNode = curr.rightChild;
while (replaceNode.leftChild != null){
replaceNode = replaceNode.leftChild;
}
} else {
replaceNode = curr.leftChild;
while (replaceNode.rightChild != null) {
replaceNode = replaceNode.rightChild;
}
}
replaceNode.leftChild = curr.leftChild;
replaceNode.rightChild = curr.rightChild;
replaceNode.parent = curr.parent;
curr = replaceNode;
} else {
curr.data = null;
curr.parent = null;
}
listSize--;
isFound = true;
} else if (curr.data.compareTo(newObject) == 1) {
curr = curr.leftChild;
} else {
curr = curr.rightChild;
}
}
}
}
我正在使用的数据集产生一个带有左子项的根,然后产生一个右子项。要删除的节点是第一个(左(子节点。但是,给出 NullPointerException 的行是
if (curr.data.compareTo(newObject) == 0){
我真的不确定是什么原因造成的。非常感谢任何和所有的帮助。
将变量初始化为new Node()
,您正在创建您不打算使用的新节点。更像这样:
void remove(Comparable newObject){
if (!isEmpty()){
Node curr = root;
然后再次replaceNode
:
if (curr.hasChildren()){
Node replaceNode;
我认为它不起作用,因为在代码结束时,您将curr
重写给它的子代,但如果它没有子级怎么办?然后你尝试将null
对象与某个对象进行比较,这就是为什么我认为它会抛出NullPointerException
.