Я знаю, что здесь есть много подобных вопросов. Я смотрел на них, но реализация каждого из них различна, и это меня просто сбивает с толку. Я пытаюсь создать двоичное дерево. Каждый раз, когда я вставляю элемент, он становится корнем, который не является тем, что я хочу. Если я попытаюсь получить доступ к данным в корневом каталоге из основного метода или передать корень другому методу, я получаю исключение нулевого указателя. Может ли кто-нибудь сказать мне, почему мой корень всегда равен нулю и почему мой метод insert не присваивает значение корню? Любые советы по лучшему дизайну для структур данных в Java также будут высоко оценены.двоичное дерево всегда null
package interviewQuestions;
public class BinaryTree {
private Node root = null;
private class Node {
int data;
Node left;
Node right;
public Node(int dataval){
data = dataval;
left = null;
right = null;
}
}
// A binary search tree must have no duplicate nodes
// Insert nodes into the tree. Return 1 on success.
public int insert(Node root, int data){
Node temp = root;
if(root == null){
Node node = new Node(data);
root = node;
System.out.println("new root is "+root.data);
return 1;
}
else if(temp.data < data && temp.right != null){
if(data < temp.right.data){
Node node = new Node(data);
node.right = temp.right;
temp.right = node;
return 1;
}
else{
temp = temp.right;
insert(temp, data);
}
}
else if(temp.data < data && temp.right == null){
Node node = new Node(data);
temp.right = node;
return 1;
}
else if(temp.data > data && temp.left != null){
if(data > temp.left.data){
Node node = new Node(data);
node.left = temp.left;
temp.left = node;
return 1;
}
else{
temp = temp.left;
insert(temp, data);
}
}
else if(temp.data > data && temp.left == null){
Node node = new Node(data);
temp.left = node;
return 1;
}
return -1;
}
public void preOrder(Node root){
if(root.left != null){
System.out.println(root.data);
root = root.left;
preOrder(root);
}
else if(root.left == null && root.right != null){
System.out.println(root.data);
root = root.right;
preOrder(root);
}
else if(root.left == null && root.right == null){
return;
}
}
// Remove
// Find
// Balance
public static void main (String[] args){
BinaryTree tree = new BinaryTree();
tree.insert(tree.root, 5);
tree.insert(tree.root, 2);
tree.insert(tree.root, 8);
tree.insert(tree.root, 1);
tree.insert(tree.root, 3);
tree.insert(tree.root, 9);
tree.insert(tree.root, 20);
tree.insert(tree.root, 10);
tree.insert(tree.root, 15);
System.out.println(tree.root);
tree.preOrder(tree.root);
System.out.println("Ya. everysing ees güten tag. YA.");
}
}
Вы должны выяснить, выполнив некоторую отладку. –
Почему вы передаете корневую переменную, когда root является частной переменной в вашем классе? Исправьте инструкцию insert, чтобы получить только данные 'data' и изменить корень частной переменной на равный узел. Ваш метод заставляет его установить параметр 'root' в' node'. Это не приводит к изменению корня классов. – Grice
Также вы никогда не писали метод 'toString()' для класса 'Node', поэтому' System.out.println (tree.root) 'просто сбрасывает имя объекта (например, BinaryTree $ Node @ 1db9742) – Grice