Search code examples
javasavebinary-tree

How to Save a Node


I've been coding a basic binary Tree in Java and have run into a problem. The goal of this program is to "learn" new questions in order to guess an animal similar to 20 questions. However, I have no idea how to "save" a node so it can be recalled by this same class the next time it runs. How to do this?

public class LearningTree {
Node root;

public void addNode(double key, String name){
    Node newNode = new Node(key, name);
    
    if (root == null){
        root = newNode;
    } else {
        Node focusNode = root;
        
        Node parent;
        
        while(true){
            parent = focusNode;`enter code here`
            
            if(key < focusNode.key){
                focusNode = focusNode.leftChild;
                
                if(focusNode == null){
                    parent.leftChild = newNode;
                    return;
                }
            } else {
                focusNode = focusNode.rightChild;
                
                if(focusNode == null){
                    parent.rightChild = newNode;
                    return;
                }
            }
            
        }
    }
}
 public void traverse(Node focusNode){
 if(focusNode != null){
     
     traverse(focusNode.leftChild);
     
     traverse(focusNode.rightChild);
 }
 }


 class Node{
 
 double key;
 String name;
 
 Node leftChild;
 Node rightChild;
 
 Node(double key, String name){
     this.key = key;
     this.name = name;
 }

}

public void keyChange(Node focusNode, double newkey){
focusNode.key = newkey;
 }

public Node findNode(double key) {
     
 

 Node focusNode = root;

    while (focusNode.key != key) {


      if (key < focusNode.key) {

          focusNode = focusNode.leftChild;
     
          } else {
 
              focusNode = focusNode.rightChild;
          }

          if (focusNode == null)
                return null;

}

   return focusNode;
     
}
 

 public static void main(String[] args){
 LearningTree Tree = new LearningTree();
 Scanner sc = new Scanner(System.in);
 
 //Nodes
 Tree.addNode(1500, "Does it have wings?");
 Tree.addNode(750, "Is it a dog?");
 
 
 
 System.out.println("Is it an animal?");
 
 double n = 1000;
 
 while(true){
 String Answer = sc.nextLine();
 String answer = Answer.toLowerCase();
 
 double k = n;
 

 if(answer.equals("y")){
     n = 1.5* n;
 }
 if(answer.equals("n")){
     n = .5*n;
 }
 if(Tree.findNode(n) != null){
 
 System.out.println(Tree.findNode(n).name + " (y/n)");
 }
 
 if(Tree.findNode(n) == null){
     System.out.println("What is it?");
     String answer1 = sc.nextLine();
     System.out.println("What would distinguish a " + answer1 + "from the     previous guess?");
     String answer2 = sc.nextLine();
     System.out.println("What would the answer be to " + answer2 + "? (y/n)");
     String answer3 = sc.nextLine();
     double s;
     
     if(Tree.findNode(k/1.5) == null){
         Tree.findNode(k/.5);
     } else {
         Tree.findNode(k/1.5);
     }
     
     if(answer3.equals("y")){
         Tree.keyChange(Tree.findNode(k), n );
         s = 1.5;
         Tree.addNode(n, Tree.findNode(n).name);
     }
         
     if(answer3.equals("n")){
             Tree.keyChange(Tree.findNode(k), n);
             s = .5;
             Tree.addNode(n, Tree.findNode(n).name );
     }
     Tree.addNode(k, answer2);
            
    
        
         
             

            }
        
         
     }
     
     
     
     
     
 }

 
 
 }

Solution

  • Maybe you could use a local file and serialize the data. Java handles this pretty well.

    NOTE: I haven't tested this code but it's a starting place.

    private void saveNode(Node n){
        FileOutputStream fout = new FileOutputStream("file.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fout);
        oos.writeObject(n);
        oos.close();
    }
    
    private Node readNode(){
       FileInputStream fin = new FileInputStream("file.txt");
       ObjectInputStream ois = new ObjectInputStream(fin);
       Node n = (Node)ois.readObject();
       ois.close();
       return n;
    }