0

プログラムの終了時にバイナリ ツリーをファイルに保存し、プログラムの再実行時にファイルを再構築しようとしています。私の保存方法は次のようになります。

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 つの子があることがわかります。

4

3 に答える 3

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;
}
于 2012-05-02T20:22:09.057 に答える
1

シリアライゼーションを使用しないのはなぜですか? および ObjectOutputStream 、ObjectInputStream および単一のメソッドでツリー全体をロードしますか?

class MyTree implements Serializable {
...

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

...
于 2012-05-02T20:32:07.613 に答える
1

あなたがしていることは間違っています。
たとえば、ツリーがある場合:

     A  
   B  C   
  D    F  
 E      

ファイルに保存しています:

A  
B  
D  
E  
C  
F    

この方法でツリーを再構築することは不可能です。例:誰の子供Dですか?BA?

どのノードがどのノードを親として持っているかを知ることができるように、たとえばレベルごとに保存するようにアルゴリズムを変更する必要があります

于 2012-05-02T20:21:25.780 に答える