2016-12-21 6 views
1

私はC BSTライブラリを実行していて、バイナリ検索ツリーをテキストファイルに保存する機能を実行しようとしています。私はそれを行う方法をかなり混乱させています。構造:木のCバイナリ検索ツリーをtxtファイルに保存する

struct Node { 
    int value; 
    struct Node *left; 
    struct Node *right; 
}; 

typedef struct Node TNode; 
typedef struct Node *binary_tree; 

が作成:それに要素を追加する

binary_tree NewBinaryTree(int value_root) { 
    binary_tree newRoot = malloc(sizeof(TNode)); 
    if (newRoot) { 
     newRoot->value = value_root; 
     newRoot->left = NULL; 
     newRoot->right = NULL; 
    } 
    return newRoot; 
} 

void Insert(binary_tree *tree, int val) { 
    if (*tree == NULL) { 
     *tree = (binary_tree)malloc(sizeof(TNode)); 
     (*tree)->value = val; 
     (*tree)->left = NULL; 
     (*tree)->right = NULL; 
    } else { 
     if (val < (*tree)->value) { 
      Insert(&(*tree)->left, val); 
     } else { 
      Insert(&(*tree)->right, val); 
     } 
    } 
} 

私は開始をしました機能が、私はこれを行う方法を知らない:

void savetree(binary_tree *tree, char * filename) 
{ 
FILE *afile; 
int remainn, counter, readsize, i; 
int *bb; 

afile = fopen(filename, "wb"); 
if (afile) { 
    bb = calloc(sizeof(int), BBSIZE); //BBSIZE =4096 
    remainn = treesize(tree); 
    counter = 0; 
    while (remainn > 0) { 
     if (remainn > BBSIZE) { 
      readsize = BBSIZE; 
     } else { 
      readsize = remainn; 
     } 

がHERESにtreesize機能:

int treesize(binary_tree tree) 
{ 
    if(tree == NULL) 
    { 
     return (0) ; 
    } 
    else 
    { 
     return(1 + treesize(tree->left) + treesize(tree->right)) ; 
    } 
} 

このsavetree機能が完了していないが、私がやった場合は/それを完了する方法についてイムわかりません正しい。

ありがとう

+0

''してくださいtypedefは構造体のノード* binary_treeポインタをtypedef'ないでください; '。読むのは本当に苦しいです。 – Stargateur

+0

あなたが記述している能力を「シリアライゼーション」といいます。バイナリツリーを作成し、それをディスク上のファイルにシリアル化し、逆シリアル化してメモリに戻すことができます。これには多くの言語に依存しないアルゴリズムがあります。最初の近似のためのGoogleの「バイナリツリーの直列化」。 – stackoverflowuser2010

答えて

1

ネストされたカッコとツリーは、同じものの代替表現です。

ので、木を書くことは読書はかなり困難です

void writenode(Node *node) 
    { 
     printf("{"); 
     printf("%d ", node-.value); 
     if(node->left) 
     writenode(node->left); 
     if(node->right) 
     writenode(node->right); 
     printf("}"); 
    } 

簡単です。不正な入力を検出し、子を再帰的に構築する必要があります。

+0

私はこのメソッドを試してみましたが、ガーベジの値(ランダム値)を表示した後にプログラムのクラッシュが発生しました。 –

+0

ヘルプありがとうございました –

0

バイナリツリーをtxtファイルに保存する最も簡単な方法は、それらを配列として保存することです。欠点は、バイナリツリーをcomplete binary treeとして保存するため、スペースを無駄にするだけです。

読みやすくても簡単です。スパースバイナリツリー(稀ノードを有するが、高さが非常にある二分木)について

int left(int i) { 
    return 2*i + 1; 
} 
int right(int i) { 
    return 2*i + 2; 
} 
int parent(int i) { 
    return (i-1)/2; 
} 

enter image description here

0

、一つの方法:インデックス番目iで左、右の子ノードの親として求めることができるのでDulguunによって提案されたように多くのNULLバイトを節約することを避けるために、これらの2つのトラバーサルからこのバイナリツリーを再構築します。

いくつかの例:Construct Full Binary Tree from given preorder and postorder traversals

関連する問題