Cで二分木を作成する方法

click fraud protection

二分木を構築します。 変数が1つしかない場合でも、すべての二分木には構造が必要です。 名前を選択し、typedefを使用して名前を作成します。typedefstructstudent_data STUDENT_DATA;

構造を定義します。 同じ構造体への2つのポインタを含めます。structstudent_data{int student_ID; intstudent_grade; STUDENT_DATA 左、 正しい;};

このデータ構造へのポインタを割り当て、NULLに初期化して、ツリーの先頭にします。STUDENT_DATA* student = NULL;

データ構造に2つの一時ポインタを割り当てます:STUDENT_DATA 新入生、 cur_student;

malloc()を使用して新しい要素を作成し、常にエラーをチェックします。if((new_student = malloc(sizeof(STUDENT_DATA)))== NULL){abort(); }

新しい要素のフィールドにデータを入力します。 左と右のフィールドをNULLに設定します。new_student-> student_ID = newID; new_student-> student_size = newsize; new_student-> left = NULL; new_student-> right = NULL;

頭の変数を考えてみましょう。 head変数がNULLの場合、これはツリーに追加される最初の要素であるため、head変数がそれを指すように設定すると、完了です。if(!students){students = new_student; 戻る; }

新しい値と現在の値が等しい場合は、重複するエントリを処理します。if(newID == cur_student-> student_ID){abort(); }

等しくない値を処理します。 新しい値が現在の値よりも小さい場合、新しい要素は左側に配置されます。 左側に何もない場合は、すぐに追加してください。 それ以外の場合は、左にトラバースしてループします。if(newID student_ID){if(cur_student-> left == NULL){cur_student-> left = newstudent; 1を返します。 } cur_student = cur_student-> left;

右側でも同じことを行います。それ以外の場合は、次のようにします。} else {if(cur_student-> right == NULL){cur_student-> right = newstudent; 1を返します。 } cur_student = cur_student-> right; }}

データ構造を指す一時変数を作成します。STUDENT_DATA* cur_student;

要素をループして、目的の値を確認します。while(cur_student){if(cur_student-> student_ID == 15){return cur_student-> student_grade; }

左または右に分岐し、見つからない場合はループします。if(cur_student-> student_ID <15){cur_student = cur_student-> right; } else {cur_student = cur_student-> left; }

ループが終了するかどうかを確認します。 含まれている場合は、アイテムが見つからなかったことを意味します。} return 0;

すべてのオペレーティングシステムがこれを自動的に処理するわけではないため、プログラムの終了時にバイナリツリーの割り当てを解除します。 これは、再帰関数を使用して行うのが最適です。voiddeallocate_binary_tree(STUDENT_DATA * tree){

左右のサブツリーの割り当てを再帰的に解除します。deallocate_binary_tree(tree-> left); Deallocate_binary_tree(ツリー->右);

二分木の検索と追加は、再帰を使用して行うこともできます。 これは、作成と保守がはるかに簡単になりますが、慣れるまでは理解するのが少し難しくなります。 2番目のCデータ構造(多くの場合、実際のデータが存在する配列またはリンクリスト)へのポインターのみを含むバイナリツリーを作成するのが一般的です。 各二分木は、リストデータの単一のフィールドをすばやく検索するためのインデックスです。

バイナリツリーからの削除はCの非常に複雑なアルゴリズムですが、バイナリツリーの多くの用途では、要素が削除されることはありません。