Почему при поиске в глубину возникает исключение NullPointerException? - PullRequest
1 голос
/ 11 ноября 2011

У меня есть небольшой фрагмент кода, чтобы произвести поиск в глубину произвольного двоичного дерева поиска. Это мой код:

public void printByDepth()
{
    Queue<BinaryNode<T>> queue = new LinkedList<BinaryNode<T>>();
    BinaryNode<T> current = this;
    queue.add(current);
    while(!queue.isEmpty()){
        current = queue.remove();
        System.out.println(current.element);
        if(current.left != null)
            queue.add(current.left);
        if(current.right != null) // had an extra semicolon here, fixed
            queue.add(current.right);
    }
}

Это довольно стандартный подход к очереди, но по какой-то причине строка 8 (println(current.element)) создает NPE. Дерево, которое я использую, должно выдать следующий вывод DF: F B G A D I C E H. Я сделал это точно на бумаге, и я никогда не должен получать current = null или queue.isEmpty () = true, прежде чем я пройдусь по всему дереву (по крайней мере, в этом случае), поэтому я не уверен, почему это происходит. Ни один из узлов не имеет нулевого содержимого.

Кроме того, интересно, что если я изменю условие while на while(current != null), я не получу NPE, но получится: F B G A D I, в нем отсутствуют элементы последнего уровня.

Я уверен, что что-то простое мне не хватает ... какие-нибудь намеки?

РЕДАКТИРОВАТЬ: убегая точка с запятой = (Спасибо, Роджер.

Ответы [ 2 ]

6 голосов
/ 11 ноября 2011

Проблема с:

if(current.right != null);
        queue.add(current.right);

Видите свою точку с запятой (;) на if? Это в основном означает: если current.right не равен NULL, то ничего не делать. После этого всегда добавляйте current.right в очередь (даже если null).

Если вы автоматически отформатируете свой код, это будет легче увидеть, так как ваши отступы теперь ошибочно предполагают, что добавление current.right относится к оператору if.

0 голосов
/ 11 ноября 2011

Последний current = queue.peek(); должен быть избыточным.Тот факт, что while(current != null) "исправляет" проблему, указывает на то, что в списке есть значение null.

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