2016-08-29 6 views
-5

現在、私は書籍からデータ構造を学んでいます。完全なバイナリツリーについては、配列に格納することができます。しかし、アルゴリズムを思いつくことはできませんし、配列を完全なバイナリツリーに変換することもできません。誰でもCでこれを手伝ってもらえますか? このような質問は、バイナリツリーでのトラバースと同様に再帰で解決できると思いますが、私はそれを行うことはできませんし、非再帰メソッドでも解決できません。完全なバイナリツリーを配列に格納するアルゴリズム

+0

ようこそ:@Peter Skarpetisで指摘したように、あなたがグローバルまたはstatic sの関数へのポインタの後に追加のパラメータを渡すの使用を避けることができます!これまでのところあなたの研究/デバッグの努力を示してください。まず[Ask]ページをお読みください。 –

+0

https://en.wikipedia.org/wiki/Binary_heap#Heap_implementation –

+0

@PeteKirkham非常にありがとう、私は良い方向を与えてくれた、私は今それを検索する方法を知っている:) – JiangFeng

答えて

1

機能へのポインタを呼び出すトラバーサルインオーダー関数が必要です。

EDIT:スタックオーバーフローへ

struct container { 
    void *data; 
    int count; 
}; 

void tree_walk_recurse(const t_node *node, void (*func)(void *, void *), void *data) 
{ 
    if (node->left) tree_walk_recurse(node->left, func, data); 
    func(node->data, data); 
    if (node->right) tree_walk_recurse(node->right, func, data); 
} 

void tree_walk(const t_node *root, void (*func)(void *, void), void *data) 
{ 
    if (root && func) tree_walk_recurse(root, func, data); 
} 

void insert(void *data, void *ptr) 
{ 
    struct data *array = ptr; 

    array->data[array->count++] = data; 
} 

/* Traverse in-order using insert */ 
struct container array; 

array.data = malloc(sizeof(struct data) * n); 
array.count = 0; 
tree_walk(root, insert, &array); 
+1

関数insertはより多くのパラメータを必要とします。配列の挿入位置へのポインタで、* ptr = dataを行うことができます。 –

+0

@PeterSkarpetis、あなたは正しいです!、編集 –

+0

@AlterMannありがとうございます。しかし、私は自分自身をはっきりと表現していないようです。私は配列内に完全なバイナリを格納すると思いますが、私が望むものは、A [1]のストアルート、A [2]の大きな息子、A [3]の小さな息子です。それから、A [4]、A [5]、A [6]、A [7]の4人の孫。この順番でどのように保管するか教えていただけますか? – JiangFeng