在我的displayStudent()
文件中的BinaryTree.java
方法内,我正在尝试将带有学生的二进制树写入文件中。我的代码给我一个错误。我已经尝试了许多不同的方法来编写这个文件但没有成功,因此我为什么在这里。
这是我的Node.java
文件:
class Node {
Student data;
Faculty data2;
Node left;
Node right;
public Node(Student data) {
this.data = data;
this.left = null;
right = null;
}
public Node(Faculty data2) {
this.data2 = data2;
this.left = null;
this.right = null;
}
}
这是我的BinaryTree.java
文件:
import java.io.*;
public class BinaryTree {
public Node root; // Declaring Node that's a root.
public void insertFaculty(Faculty faculty) {
root = insertFaculty(faculty,root); // Let root equal faculty being inserted.
}
private Node insertFaculty(Faculty faculty, Node t) {
if(root == null) { // If the root is empty.
return new Node(faculty); // Return a faculty node.
}
// If inserted faculty last name is less than the current faculty last name
if(faculty.getLastName().compareTo(t.data2.getLastName()) < 0) {
if(t.left == null) { // If the left node is empty.
t.left = new Node(faculty); // Create a left a node that accepts a faculty name.
} else {
t.left = insertFaculty(faculty,t.left); // Insert faculty members to the left recursively.
}
return t; // Return node.
}
// If inserted faculty last name is less than the current faculty last name.
else if(faculty.getLastName().compareTo(t.data2.getLastName()) > 0) {
if(t.right == null) { // If the right node is empty.
t.right = new Node(faculty); // Create a right a node that accepts a faculty name.
} else {
t.right = insertFaculty(faculty,t.right); // Insert faculty members to the right recursively.
}
}
return t; // Return node.
}
public void insertStudent(Student s) {
root = insertStudent(s,root); // Let root equal student being inserted.
}
private Node insertStudent(Student s, Node t) {
if(root == null) { // If the root is empty.
return new Node(s); // Return a Student node.
}
// If inserted student last name is less than the current student last name.
if(s.getLastName().compareTo(t.data.getLastName()) < 0) {
if(t.left == null) { // If the left node is empty.
t.left = new Node(s); // Create a left a node that accepts a student name.
} else {
t.left = insertStudent(s,t.left); // Insert student members to the left recursively.
}
return t; // Return node;
}
// If inserted student last name is greater than the current student last name.
else if(s.getLastName().compareTo(t.data.getLastName()) > 0) {
if(t.right == null) { // If the right node is empty.
t.right = new Node(s); // Create a right a node that accepts a student name.
} else {
t.right = insertStudent(s,t.right); // Insert student members to the right recursively.
}
}
return t; // Return name.
}
public Node studentDelete(Student s, Node t) {
if(t != null) { // If t is empty.
// If inserted student last name is less than the current student last name.
if(s.getLastName().compareTo(t.data.getLastName()) < 0) {
t.left = studentDelete(s,t.left); // Left node will delete appropriate name recursively.
// If inserted student last name is greater than the current student last name.
} else if(s.getLastName().compareTo(t.data.getLastName()) > 0) {
t.right = studentDelete(s,t.right); // Right node will delete appropriate name recursively.
} else {
if(t.left == null) { // If left node is empty.
return t.right; // Return right node.
} else if(t.right == null) { // If right node is empty.
return t.left; // Return left node.
}
}
}
return t; // Return node.
}
public Node facultyDelete(Faculty faculty, Node t) {
if(t != null) { // If t is empty.
// If inserted faculty last name is less than the current faculty last name.
if(faculty.getLastName().compareTo(t.data2.getLastName()) < 0) {
t.left = facultyDelete(faculty,t.left); // Left node will delete appropriate name recursively.
// If inserted faculty last name is greater than the current faculty last name.
} else if(faculty.getLastName().compareTo(t.data2.getLastName()) > 0) {
t.right = facultyDelete(faculty,t.right); // Right node will delete appropriate name recursively.
} else {
if(t.left == null) { // If left node is empty.
return t.right; // Return right node.
} else if(t.right == null) { // If right node is empty.
return t.left; // Return left node.
}
}
}
return t; // Return node.
}
public void displayStudent(Node root) throws IOException {
if(root != null) { // If root isn't empty.
displayStudent(root.left); // Recursively display left nodes.
System.out.println(root.data.toString()); // Print to the console data that's in the root in order.
displayStudent(root.right); // Recursively display right nodes.
}
String file = "Student.txt"; // Student text file, this will be used to write in student information.
FileWriter fw = null; // The file writer used to write in student information initially set to null.
try {
fw = new FileWriter(file, true); // Place file in FileWriter, true allows file to appended writer.
for(int i = 0; i < 30; i++) {
fw.write(root.data.toString());
}
fw.close(); // Close file.
} catch(FileNotFoundException e) { // Exception will be thrown if the file isn't found.
System.out.println("File not found!"); // Message will print if the file isn't found.
}
}
public void displayFaculty(Node root) {
if(root != null) { // If root isn't empty.
displayFaculty(root.left); // Recursively display left nodes.
System.out.println(root.data2.toString()); // Print to the console data that's in the root inorder.
displayFaculty(root.right); // Recursively display right nodes.
}
}
}
这是我的Main.java
文件:
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
Student student1 = new Student("Mike", "Piazza", "S3123456");
Student student2 = new Student("Jack", "Jill", "S3123456");
Student student3 = new Student("Alice", "Jones", "S3123456");
BinaryTree bt = new BinaryTree();
bt.insertStudent(student1);
bt.insertStudent(student2);
bt.insertStudent(student3);
bt.displayStudent(bt.root);
}
}
这是我的Student.txt
文件:
null null null null null null null
这是我在控制台中的error
:
Exception in thread "main" java.lang.NullPointerException
at BinaryTree.displayStudent(BinaryTree.java:118)
at BinaryTree.displayStudent(BinaryTree.java:107)
at BinaryTree.displayStudent(BinaryTree.java:107)
at Main.main(Main.java:13)
答案 0 :(得分:2)
它打印的原因&#34; null null null null null&#34;可以在你的displayStudent()方法中找到。您要求displayStudent(root.right),但是您在构造函数中将这些节点设置为null。
public Node(Student data) {
this.data = data;
this.left = null;
right = null;
}
因此,当您开始显示该数据时,您将有效地运行displayStudent(null);
if(root != null) { // If root isn't empty.
displayStudent(root.left); // Recursively display left nodes.
System.out.println(root.data.toString()); // Print to the console data that's in the root in order.
displayStudent(root.right); // Recursively display right nodes.
}
我认为你可以解决这个问题:
if(root != null) { // If root isn't empty.
if(root.left != null){
displayStudent(root.left); // Recursively display left nodes.
}
System.out.println(root.data.toString()); // Print to the console data that's in the root in order.
if(root.right != null){
displayStudent(root.right); // Recursively display right nodes.
}
}
您获得空指针异常的原因是您在调用fw.write(root.data.toString());
之前未检查空值
相反,我使用StringBuilder添加到您写入文件一次的String,而不是在每次调用displayStudent()内部。我将其作为练习留给OP。
随机建议:
拥有一个包含学生和教师的二元树,你可能会让你有一天感到悲伤。我鼓励你在整个树中只有一种数据类型(可能有学生和教师从一些抽象类扩展)。