Этот метод принимает дерево целых чисел и строит строку следующего вида:
(Данные в корне, 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;
}
}
Ошибка здесь:
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
.
NPE
свойNPE
полностью, включая трассировку стека.