Я написал функцию удаления для бинарного дерева поиска, которое использует цикл while для перехода к конкретному узлу, который нужно удалить.Тем не менее, он никогда не добирается - он просто повторяет неизвестное количество раз и затем выдает мне исключение NullPointerException.
Мне было интересно, была ли это ошибка в моей логике обхода, но она точно такая же, как в моем дополнениифункция, которая работает отлично.
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){
, и я действительно не совсем уверен, что является причиной этого.Любая помощь очень ценится.