简体   繁体   中英

Why won't my BST get written to a file?

I'm trying to write my BST into a text file but some how it's not working. I would like to know where I messed up at because as of now, nothing is being written into the file. The problem is in the BinaryTree.java . The display() method is where I'm trying to place the items into Student.txt file.

Here's my Node.java :

class Node  {
    Student data;
    Faculty data2;
    Node left;
    Node right;

    public Node(Student data) {
        this.data = data;
        this.left = left;
        this.right = left;
    }

    public Node(Faculty data2) {
        this.data2 = data2;
        this.left = left;
        this.right = right;
    }
}

Here's my BinaryTree.java :

int index = 0;
String[] sa = new String[index];

public void studentArray() {
    studentArray(root,index);
}

public int studentArray(Node root, int index) {     
    if(root.left != null) {
        index = studentArray(root.left, index);
    } 
    sa[++index] = root.data.getLastName().toString();
    if(root.right != null) {
        index = studentArray(root.right,index);
    }
    return index;
}

public void displayStudent(Node root) throws IOException { 
    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. 
        }
    }

    String file = "Student.txt"; 
    FileWriter fw = new FileWriter(new File(file));

    try {
        for(index = 0; index < sa.length; index++) {
            fw.write(sa[index] + " ");
        }
        fw.close();
    } catch(Exception e) {
        System.out.println("File not found.");
    }
}

Here's my 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);
    }   

Here's my Student.txt file:

*displays nothing*

Java does not have a growing array, so studentArray will not work.

Either use recursion:

try (PrintWriter out = new PrintWriter(file, "UTF-8")) {
    print(out, root);
} // automatically closes out

void print(PrintWriter out, Node node) {
    if (node != null) {
        print(out, node.left);
        out.println(...);
        print(out, node.right);
    }
}

The try-with-resources is usefull. The charset UTF-8 would allow any sign in the students' names.

Alternative to an array, use ArrayList :

List<String> sa = new ArrayList<>();

sa.add(root.data.getLastName().toString();

for (int i = 0; i < sa.size(); ++i) { // Old-style, if you need the index i
    String s = sa.get(i);
    ...
    sa.set(i, s + s);
}

for (String s : sa) {
    System.out.println(s);
}

I would suggest to use StringBuilder to create string for display of tree value. Write to file should be in different class so it will be loosely coupled and in feature depending on type of traversal type it will print.If you put in a array then again you need to traverse which will increase complexity and also I will prefer to use iterative way.My logic is using pre-order traversal.

public String displayStudent(TreeNode root) {
 if (root == null)
  return null;
 Stack < TreeNode > stack = new Stack < TreeNode > ();
 stack.push(root);
 StringBuilder sb = new StringBuilder();

 while (!stack.isEmpty()) {
  TreeNode h = stack.pop();
  if (h != null) {
   sb.append(h.val + ",");
   if (h.right != null) {
    stack.push(h.right);
   }
   if (h.left != null) {
    stack.push(h.left);
   }

   stack.push(h.left);
  }
 }

 return sb.toString().substring(0, sb.length() - 1);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM