Проблема с указателем в дереве двоичного поиска при попытке печати

Я пишу метод для печати двоичного дерева поиска по порядку. Я нашел способ сделать это, но он требует либо удаления, либо обнуления узлов по мере их печати. Ниже мой код:

public String printKeysInOrder() {
        String output = "";
        if (isEmpty()) return "()";
        else{
            int i = 0;
            while(i!=size()){
                Node x = root;
                int loopBreak = 0;
                while(loopBreak!=1){
                    if(x.left != null) x = x.left;
                    else if (x.right != null){
                        output = output + " " + x.val;
                        x.key = null;
                        x = x.right;
                        i++;
                    }
                    else{
                        output = output + " " + x.val;
                        x.key = null;
                        loopBreak = 1;
                    }
                }
                i++;
            }
        }
        return output;
    }

для дерева:

            _7_
          /     \
        _3_      8
      /     \
     1       6
      \     /
       2   4
            \
             5

он должен напечатать "1 2 3 4 5 6 7 8"

код работает таким образом, что он предпочитает двигаться влево по дереву до тех пор, пока он больше не сможет двигаться влево, затем он сохраняет значение этого узла в строковом выводе, делает ключ узлов равным нулю (поскольку будущие итерации цикла не спуститесь по этому дереву) и перемещается вправо, если это возможно, или повторяет цикл назад.

Хотя у меня возникли проблемы с тем, чтобы узел был равен нулю, например, когда код выполняется (через тест junit), код не распознает этот нулевой ключ и все равно проходит через это поддерево? Может ли кто-нибудь помочь мне или сказать мне, как сделать так, чтобы указатели x.left и x.right на будущих итерациях распознавали узел как нулевой?


person roughosing    schedule 10.11.2015    source источник


Ответы (1)


Вам не нужно аннулировать или удалять узлы, вам нужен алгоритм обхода.

Приведенный здесь обход по порядку должен работать без серьезных изменений: http://www.javabeat.net/binary-search-tree-traversal-java/

Другой объектно-ориентированный подход к этому — посетитель, предоставляемый упорядоченному обходу, который позволяет вам указать действие, выполняемое в каждом узле, будь то печать, сбор, сопоставление или что-то еще.

person Alain O'Dea    schedule 10.11.2015
comment
То, как лектор изложил тестовые примеры, я не могу использовать пустоту, поэтому рекурсия для этого метода невозможна, мне нужно использовать только этот метод String - person roughosing; 10.11.2015
comment
Ничто в сигнатуре типа не должно препятствовать рекурсии. Вместо того, чтобы печатать в System.out, вы можете добавить к строке и вернуть ее, а затем добавить это к строке, созданной выше. Если бы пустота имела здесь значение, то языки с рекурсией, которые требуют, чтобы функция имела результат, подобный Haskell, были бы невозможны. - person Alain O'Dea; 10.11.2015
comment
Спасибо, потратил много времени на изучение рекурсии вчера вечером, чтобы помочь разобраться, в конце концов понял, спасибо за помощь, этот код действительно помог мне туда добраться - person roughosing; 12.11.2015
comment
@GregPenrose круто. Отличный рабочий друг. Я рад, что смог помочь :) - person Alain O'Dea; 12.11.2015