2013-11-21 49 views
0

所以我一直在Java中编写一个基本的二叉树,并且遇到了问题。这个计划的目标是“学习”新的问题,以便猜出类似20个问题的动物。但是,我不知道如何“保存”一个节点,以便下次运行时可以由同一个类重新调用它。如何做到这一点的任何提示或例子? (另外,如果你看到任何其他的高音错误,随意批评/评论)如何保存节点

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); 






      } 


    } 





} 



} 

回答

0

也许你可以使用本地文件并序列化数据。 Java处理得很好。

注:我没有测试过这个代码,但它是一个开始的地方。

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; 
} 
+0

没有,显然它不是seriazable或任何本meansException线程 “main” java.io.NotSerializableException:LearningTree $节点 \t在java.io.ObjectOutputStream.writeObject0(来源不明) \t在java.io .ObjectOutputStream.writeObject(Unknown Source) \t at LearningTree.saveNode(LearningTree.java:103) \t at LearningTree.main(LearningTree.java:167) – metelofe

0

你可能想这个对象序列化到一个文件,以便它可以取回数据时,它贯穿反序列化下回。检查ObjectOutputstream类的文档。话虽如此,你需要有一些逻辑去配合它,