1

ツリー値のソートされた配列を作成するという関数がすでにあると考えてくださいint* binToArrayInOrder(TreeRoot* tr)(順序どおりであるため)。

とにかく、プレオーダー配列の同じツリー表現などの他の情報 なしで、順序付けされた配列からツリーを構築し直すことはできますか?

Cで配列をテキストファイルに書き込むにはどうすればよいですか。コードを教えてください。

4

2 に答える 2

1

[1] 配列要素を二分木に再挿入できます。ただし、バランシング アルゴリズムによっては、ツリーを配列に抽出したときとまったく同じにならない場合があります。

【2】これはどうですか?

void print_array (int *array, size_t sz, FILE *f) {
    if (!sz) return;
    fprintf(f, "%d\n", *array);
    print_array(array+1, sz-1, f);
}

あなたのコメントから、あなたの実際の質問は、バイナリツリーをディスクに保存してから復元する方法です。これは、データ構造のシリアル化の問題です。この問題では、順序通りのウォークはおそらく必要ありません。代わりに、シリアル化は、データ構造のレイアウト方法を反映する必要があります。したがって、バイナリ ノードを記述するレコードが必要です。

struct binary_node_file_data {
    char data_[MAX_BINARY_NODE_DATA_SIZE];
    int parent_;
};

これで、バイナリ ツリーの事前注文トラバーサルを実行して、ノードにデータを入力できます。

struct binary_node_fila_data *bfd = malloc(sizeof(*bfd)*nodeCount);
int count = 0;
populate_binary_node_file(tree, bfd, &count, -1);

void populate_binary_node_file(binary_tree_t *tree,
                               struct binary_node_file_data *bfd,
                               int *count,
                               int parent) {
    if (tree) {
        int me = *count;
        *count += 1;
        export_binary_node_data(tree, &bfd[me], parent);
        populate_binary_node_file(tree->left_subtree, bfd, count, me);
        populate_binary_node_file(tree->right_subtree, bfd, count, me);
    }
}

ここでは、ポインター-1のように扱われることを期待しています。NULL次に、ファイルにダンプしbfdます。ツリーの復元は演習として残します。この問題をもう少し考えてみると、トラバーサルが前順か順順 (または後順) かは問題ではありません。復元ステップでは、すべての子が親を見つけて、左右のポインターを適切に設定できるようにする必要があります。

于 2012-07-07T19:22:20.890 に答える
0

最初の質問: いいえ、ノードの順序付けされたリストでは、同じツリーを再構築することはできません。

たとえば、ツリー

  3
 2
1

inorder traversal 1 2 3 を生成します

 2
1 3

も 1 2 3 を生成します。したがって、特定の 1 2 3 を生成するためにどのツリーが使用されたかはわかりません。

2 番目の質問: STL ファイル I/O をまだ使用したことがありません。

于 2012-07-07T19:22:34.423 に答える