从文件创建二叉树

时间:2012-05-02 20:05:46

标签: java file-io binary-tree

我正在尝试在结束程序时将二叉树保存到文件中,并在我再次运行程序时重建它。我的save方法看起来像这样:

public static void save(TreeNode node, BufferedWriter out) {
    if (node == null) return;
    out.write(node.value()); // these nodes hold Strings
    out.newLine();
    save(node.left(), out);
    save(node.right(), out);
}

我遇到麻烦的部分是重建过程,所以非常感谢你的帮助。

编辑:众所周知,每个节点都有2个或0个孩子。

3 个答案:

答案 0 :(得分:2)

如果要将树保存在完全相同的分支结构中,则需要表示null。

private static final String NULL_TREE_NODE = "";

public static void save(TreeNode node, BufferedWriter out) {
    if (node == null) {
        out.write(NULL_TREE_NODE); // null
        out.newLine();
        return;
    }
    assert !node.value().equals(NULL_TREE_NODE); // Reserver for us.
    assert !node.value().matches(".*[\r\n].*"); // Newline not allowed in value.
    out.write(node.value()); // these nodes hold Strings
    out.newLine();
    save(node.left(), out);
    save(node.right(), out);
}

public static TreeNode load(BufferedReader in) throws IOException {
    String value = in.readLine();
    if (value == null)
        throw new EOFException(); // Unexpected end of input.
    if (value.equals(NULL_TREE_NODE)) {
        return null;
    }
    TreeNode node = new TreeNode();
    node.value(value);
    node.left(load(in));
    node.right(load(in));
    return node;
}

答案 1 :(得分:1)

你在做什么是错的。
例如。如果你有一棵树:

     A  
   B  C   
  D    F  
 E      

您要保存到文件:

A  
B  
D  
E  
C  
F    

以这种方式重建树是不可能的。例如。谁的孩子是DBA

您必须更改算法以保存,例如逐级进行,以便能够知道哪个节点具有哪个节点作为父节点

答案 2 :(得分:1)

为什么不使用序列化?和ObjectOutputStream,ObjectInputStream以及通过单个方法加载整个树?

class MyTree implements Serializable {
...

    ObjectOutputStream out = null;
    try {
       out = new ObjectOutputStream(new FileOutputStream("xxx.dat"));
       out.writeObject(tree);
    }

...