2017-01-26 10 views
2

Я применил метод toString для BST, но выглядит так, как будто работает, но не стабилен. , например для этого дерева toString работает отлично: correct , но для этого, это неправильно wrongДвоичное дерево поиска toString Java

кто может помочь, что происходит?

@Override 
    public String toString() { 
     return "(" + toStringB(new StringBuilder(), root()).toString() + ")"; 
    } 

    private StringBuilder toStringB(StringBuilder string, Node<E> node) { 
     if (node != null) { 
      string.append(node.getElement()); 
      if (left(node) != null) { 
       toStringB(string.append(" ("), left(node)); 
      } 
      if (right(node) != null) { 
       toStringB(string.append(", "), right(node)); 
       string.append(')'); 
      } 
     } 
     return string; 
    } 
+0

Не могли бы вы дать нам полный код, чтобы мы могли его запустить? –

ответ

0

Ваша проблема заключается здесь:

 if (left(node) != null) { 
      toStringB(string.append(" ("), left(node)); 
     } 
     if (right(node) != null) { 
      toStringB(string.append(", "), right(node)); 
      string.append(')'); 
     } 

Если у вас есть левый узел, но не имеет права узел, вы будете добавлять (left. Если у вас есть правый узел без левого узла, вы добавите , right). Это дает вам неправильные совпадающие круглые скобки и запятые запятые.

Я хотел бы отметить, ваши "отлично работает" пример на самом деле не является правильным, либо:

(10 (7 (3 (2, 5), 9), 10, 30 (11 (10)))

Давайте спрячем узлы под 7 и 30:

(10 (7 (...), 10, 30 (...))

Ваш корневой узел 10 имеет 3 детей 7, 10 и 30. Это не двоичное дерево!

О, и несбалансированные круглые скобки.

+0

Ох, спасибо, не заметил этого. вы можете помочь исправить это, пожалуйста? –

+0

Если у вас есть левый узел ИЛИ правый узел, добавьте открытые круглые скобки. Если у вас есть левый узел, добавьте его. Если у вас есть правый правый узел, добавьте запятую. Если у вас есть правильный узел, добавьте его. Если у вас есть правый правый правый узел, добавьте закрытую скобку. – AJNeufeld

+0

О, большое вам спасибо, пока это работает! (10 (5 (3 (2), 9), 10 (30 (11 (10))))) –