我为二进制搜索树编写了一个remove函数,该树使用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){
我真的不确定是什么原因造成的。任何帮助都将不胜感激。
答案 0 :(得分:0)
首先,不要将变量初始化为new Node()
,而是要创建不需要的新节点。像这样做:
void remove(Comparable newObject){
if (!isEmpty()){
Node curr = root;
,然后再输入您的replaceNode
:
if (curr.hasChildren()){
Node replaceNode;
,我认为它不起作用,因为在代码末尾,您将curr
重写为其子级,但是如果它没有子级怎么办?然后,您尝试将null
对象与某个对象进行比较,这就是为什么我认为它会抛出NullPointerException
。