2012-05-02 6 views
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); 
} 

私はとのトラブルを抱えている部分が再構築プロセスであるので、それに役立つことははるかに高く評価されるだろう。

EDIT:すべてのノードに2または0の子があることがわかります。

+1

これまでに何がありましたか?何が問題になっていますか? – twain249

+0

'ObjectOutPutStream'でシリアル化し、' ObjectInputStream'で逆シリアル化してください。 – esej

+0

@ A.R.S。私はあなたが読書に問題があることを理解していますが、私が知りたいのは、読書のどの部分、つまりファイルの設定、行の読み込み、ツリーの作成、ノードが適切な場所にないかなどでした。 – twain249

答えて

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

これはちょうど左翼の木を作成します。ファイルが終わるまですべて左に移動します。木は再構築できません – Cratylus

+0

いいえ、データ構造に再帰的に従います。 'k(f(a、null、null)、null)、p(null、null))'は '' NTN NTN NTN p NTN NTN ' –

+0

'node.left(load(in)); 'はあなたの例でファイルが終了するまで再帰的に呼び出されています。 – Cratylus

1

あなたがしていることは間違っています。
など。あなたがファイルに保存されている

 A 
    B C 
    D F 
E  

:あなたは木を持っている場合

A 
B 
D 
E 
C 
F  

木をこのように再構築することは不可能です。例えば。誰が子供ですかDBさんですか、Aさんですか?

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

1

なぜシリアル化を使用しないのですか?およびObjectOutputStream、ObjectInputStream、単一のメソッドload whole tree?

class MyTree implements Serializable { 
... 

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

... 
+1

シリアライゼーションはJavaで巨大なオーバーヘッドを持っています。あなたがそれを自分で実装していない限り。しかし(大きい)コレクションの場合は、一般的には悪い考えです... –

+0

しかし、反対側のnode.value()?単にいくつかのプリミティブより大きなオブジェクトを保存したい場合はどうしますか?バイナリツリーは単なる整数以上のものを保持できます。そしてシリアライゼーションはかなり簡単な方法で、それに対処する方法です。テキストファイルのようなStoirngオブジェクトはシリアライゼーションよりもはるかに優れていません – Kousalik

+1

私はそれが簡単だということに同意します。パフォーマンスについて気にしなければ、それは問題ありません。しかし、シリアライゼーションとは、クラス全体をパッキングすることを意味していることを覚えておいてください。リファレンスとそのクラスにすべての値を加えたものです。いくつかのデータ構造については、多くの作業が必要です。私はそれは動作しませんが、それはパフォーマンスが低いことを言っていません。 –

関連する問題