Цикл бинарного поиска Java, возвращающий нулевую ссылку на объект? - PullRequest
0 голосов
/ 29 марта 2019

Я написал функцию удаления для бинарного дерева поиска, которое использует цикл 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){

, и я действительно не совсем уверен, что является причиной этого.Любая помощь очень ценится.

1 Ответ

0 голосов
/ 29 марта 2019

Прежде всего, не инициализируйте переменную как new Node(), вы создаете новые узлы, которые вы не собираетесь использовать.Сделайте это примерно так:

void remove(Comparable newObject){
    if (!isEmpty()){
        Node curr = root;

, а затем снова ваш replaceNode:

if (curr.hasChildren()){
    Node replaceNode;

, и я думаю, что это не работает, потому что в конце кода вы переписываете curr своим детям, но что, если у него нет детей?Затем вы пытаетесь сравнить объект null с некоторым объектом, и поэтому я думаю, что он выдает NullPointerException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...