Я получаю ошибки при выполнении следующего кода.Я предоставил комментарии, чтобы описать, что происходит.
// Node
class TreeNode {
char value;
TreeNode left;
TreeNode right;
}
// Main class
public class BinaryTree {
// Global variables
char[] preorder;
int i = 0;
// Main method runs gatherOutput
public static void main(String[] args) throws IOException {
new BinaryTree().gatherOutput();
}
// This takes a null tree as input from the gatherOutput method
// and whenever a 0 is encountered in the preorder character array
// (from a string from System.in) a new external node is created with
// a value of 0. Whenever a letter is encountered in the character
// array, a new internal node is created with that letter as the value.
//
// =====ArrayOutOfBoundsException occurs somewhere here=====
//
public TreeNode createTree(TreeNode tree) throws IOException {
if (preorder[i] == 0) {
tree = new TreeNode();
tree.value = 0;
tree.left = tree.right = null;
i++;
} else {
tree = new TreeNode();
tree.value = preorder[i];
i++;
createTree(tree.left);
createTree(tree.right);
}
return tree;
}
// Supposed to print out contents of the created binary trees.
// Just for testing purposes, but it's not working right now for some reason.
public void preorderTraversal(TreeNode tree) {
if (tree != null) {
System.out.println(tree.value + " ");
preorderTraversal(tree.left);
preorderTraversal(tree.right);
}
}
// Reads System.in for the Strings used in making the binary tree
// and is supposed to make a different binary tree for every line of input
public void gatherOutput() throws IOException {
TreeNode tree = null;
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(input);
preorder = reader.readLine().toCharArray();
while (reader.readLine() != null) {
tree = createTree(tree);
preorderTraversal(tree);
i = 0;
}
}
}
Я получаю ошибку ArrayIndexOutOfBounds всякий раз, когда у меня есть более одной строки ввода.Например:
b
b
Трассировка стека:
Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException:1
в btsmall.createTree (btsmall.java:22)
в btsmall.createTree (btsmall.java:31)
в btsmall.gatherOutput (btsmall.java:53)
в btsmall.main(btsmall.java:18)
Это происходит в методе createTree, но я не могу точно определить, почему.Метод preorderTraversal, похоже, не работает, даже когда у меня есть только одна строка ввода, так как я не получаю вывод от запуска программы, но я не знаю почему.Может кто-нибудь помочь мне, пожалуйста?
Спасибо.
РЕДАКТИРОВАТЬ: я внес изменения в следующие два метода, и я больше не получаю ошибку ArrayIndexOutOfBounds.
public void createTree(TreeNode tree) throws IOException {
if (i >= preorder.length) {
i++;
} else if (preorder[i] == '0') {
tree = new TreeNode();
tree.value = '0';
tree.left = tree.right = null;
i++;
} else {
tree = new TreeNode();
tree.value = preorder[i];
i++;
createTree(tree.left);
createTree(tree.right);
}
}
public void gatherOutput() throws IOException {
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(input);
String line = null;
TreeNode tree = new TreeNode();
while ((line = reader.readLine()) != null) {
preorder = line.toCharArray();
tree = createTree(tree);
preorderTraversal(tree);
i = 0;
}
}
Однаковывод preorderTraversal выводит один квадрат вместо значений для всех узлов в предзаказе.