我想知道为什么我的display()
方法即使在将项目插入我的二叉树之后也在打印基本案例。我想比较学生的姓氏。我想要的只是显示我的树,所以我可以确认insert()
是有效的。
这是我的Node.java
文件:
class Node {
Student data;
Node left;
Node right;
public Node(Student data) {
this.data = data;
left = null;
right = null;
}
}
这是我的BinaryTree.java
文件:
public class BinaryTree {
public Node root;
public void insert(Student s) {
root.left = new Node(s);
root.right = new Node(s);
root = insert(s,root);
}
private Node insert(Student s, Node t) {
if(t == null) {
t = new Node(s);
return t;
}
else {
if(s.getLastName().compareTo(t.data.getLastName()) < 0) {
t.left = new Node(s);
t.left = insert(s,t.left);
return t.left;
} else if(s.getLastName().compareTo(t.data.getLastName()) > 0) {
t.right = new Node(s);
t.right = insert(s,t.right);
return t.right;
}
}
return t;
}
public void display(Node root) {
if(root == null) {
System.out.println("Nothing found.");
} else if(root != null) {
display(root.right);
System.out.println(root.data);
display(root.left);
}
}
}
这是我的Student.java
文件:
public class Student {
private String firstName;
private String lastName;
private String id;
public Student(String first, String last, String Identification) {
firstName = first;
lastName = last;
id = Identification;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public boolean equals(String studentId) {
return id.equals(studentId);
}
}
这是我的Main.java
文件:
public class Main {
public static void main(String[] args) {
Student student = new Student("hi", "bye", "testing");
Student student2 = new Student("out", "some", "names");
BinaryTree bt = new BinaryTree();
bt.insert(student);
bt.insert(student2);
bt.display(bt.root);
}
}
这是控制台中的output
:
Nothing found.
答案 0 :(得分:1)
我说要专注于插入逻辑,因为无论如何都是错误的。
您不需要显示方法来查看树。启动调试器,并检查左右Node对象引用
1)你立即在空树上击中nullpointerexception 2)您只需要在空树上分配根,而不是将每个节点设置为可以到达同一学生节点
例如,它就是这个
public class BinaryTree {
public Node root;
public void insert(Student s) {
root = insert(s,root);
}
private Node insert(Student s, Node t) {
if (root == null) return new Node(s);
if (...) // compare names
然后,如果你看这里,你可以随时覆盖new Node
。
if(s.getLastName().compareTo(t.data.getLastName()) < 0) {
t.left = new Node(s); // this is useless
t.left = insert(s,t.left);
return t.left;
您需要检查何时在叶节点处,然后相应地返回。并且您需要返回当前节点备份递归,而不是孩子。
if(s.getLastName().compareTo(t.data.getLastName()) < 0) {
if (t left == null) {
t.left = new Node(s);
} else {
t.left = insert(s,t); // insert using t as the new root
}
return t; // return t with its new child
为右侧做同样的事情
如果这不起作用,请尝试为小3节点树写出算法,然后为4-7节点平衡树写出