Двоичные деревья и NullPointerException

1

Этот метод принимает дерево целых чисел и строит строку следующего вида:

(Данные в корне, String левого поддерева, строковое правое поддерево)

Например, если дерево переменных хранит ссылку на следующее дерево:

          +---+
          | 2 |
          +---+
         /     \
     +---+     +---+
     | 8 |     | 1 |
     +---+     +---+
    /         /     \
+---+     +---+     +---+
| 0 |     | 7 |     | 6 |
+---+     +---+     +---+
         /               \
     +---+               +---+
     | 4 |               | 9 |
     +---+               +---+

Он должен вернуть строку:

"(2, (8, 0, empty), (1, (7, 4, empty), (6, empty, 9)))"

Метод должен возвращать "пустой" для пустого дерева. Для листового узла он должен возвращать данные в узле как String. Для узла ветки он должен вернуть строку в скобках, содержащую три элемента, разделенных запятыми:

С моим методом он иногда работает, но иногда он генерирует исключение NullPointerException. Может ли кто-нибудь указать, где и почему это происходит?

Вот что я имею:

 private IntTreeNode overallRoot; // first node; linked to other nodes

 // post: returns the string of all data in leaves. For a branch node, return a parenthesized String
 //       w/ three elementsseparated by commas. return empty for empty tree
 public String toString2() {
     if (overallRoot == null) { // If empty tree
         return "empty";
     } else {
         return toString2(overallRoot);
     }
 }

 // helper for toString
 private String toString2(IntTreeNode root) {
     String value = "";
     if (root.left != null && root.right != null) { // If both branches exist
         value += "(" + root.data + ", " + toString2(root.left)+ ", " + toString2(root.right) + ")";  
     } else if (root.left != null && root.right == null) { // if right branch is empty
         value += "(" + root.data + ", " + toString2(root.left) + ", empty)";
     } else if (root.left == null && root.right != null) { // if left branch is empty
         value += "(" + root.data + ", empty, " + toString2(root.left) + ")";
     } else { // If at a leaf
         return "" + root.data;
     }
     return value;
 }

Вот класс node:

public class IntTreeNode {
     public int data;
     public IntTreeNode left;
     public IntTreeNode right;

     // constructs a leaf node with given data
     public IntTreeNode(int data) {
         this(data, null, null);
     }

     // constructs a branch node with given data, left subtree,
     // right subtree
     public IntTreeNode(int data, IntTreeNode left, IntTreeNode right) {
         this.data = data;
         this.left = left;
         this.right = right;
     }
}
  • 1
    NPE свой NPE полностью, включая трассировку стека.
  • 0
    Можете ли вы привести пример, где это работает, а где нет?
Теги:
recursion
binary-tree

1 ответ

4
Лучший ответ

Ошибка здесь:

else if (root.left == null && root.right != null) { // if left branch is empty
         value += "(" + root.data + ", empty, " + toString2(root.left) + ")";
}

Должен быть...

else if (root.left == null && root.right != null) { // if left branch is empty
         value += "(" + root.data + ", empty, " + toString2(root.right) + ")";
}

..., передавая root.right а не root.left to toString2.

  • 0
    Хороший улов @ Фам Трунг
  • 1
    Вау, спасибо. Не могу поверить, что это была просто "незначительная" ошибка. Вот что происходит, когда вы не высыпаетесь и часами работаете без перерыва.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню