C でバイナリ ツリーを作成する方法
C でバイナリ ツリーを作成する方法 C のバイナリ ツリーは、データを動的に編成して簡単に検索できるようにする優れた方法です。ただし、維持するには多くの作業が必要です。
バイナリ ツリーを作成する
ステップ 1
二分木を構築します。変数が 1 つしかない場合でも、すべてのバイナリ ツリーには構造が必要です。名前を選択し、typedef を使用して作成します:typedef struct student_data STUDENT_DATA;
ステップ 2
構造を定義します。同じ構造体への 2 つのポインターを含めます。 int student_grade; STUDENT_DATA 左 右;};
ステップ 3
このデータ構造へのポインターを割り当て、NULL に初期化して、ツリーの先頭にします:STUDENT_DATA *students =NULL;
バイナリ ツリーに追加
ステップ 1
データ構造に 2 つの一時ポインタを割り当てます:STUDENT_DATA new_student, cur_student;
ステップ 2
malloc() を使用して新しい要素を作成し、常にエラーをチェックします。 }
ステップ 3
新しい要素のフィールドに入力します。その左右のフィールドを NULL に設定します:new_student->student_ID =newID;new_student->student_size =newsize;new_student->left =NULL;new_student->right =NULL;
ステップ 4
head 変数を考えます。 head 変数が NULL の場合、これがツリーに追加された最初の要素であるため、 head 変数がそれを指すように設定すれば完了です。戻る; }
ステップ 5
ツリーの一番上から始めます:cur_student =students;while (cur_student) {
ステップ 6
新しい値と現在の値が等しい場合、重複するエントリを処理します。 }
ステップ 7
等しくない値に対処します。新しい値が現在の値より小さい場合、新しい要素は左側に配置されます。左側に何もない場合はすぐに追加してください。それ以外の場合は、左にトラバースしてループします。 1 を返します。 } cur_student =cur_student->左;
ステップ 8
それ以外の場合は、右側で同じことを行います。 1 を返します。 } cur_student =cur_student->右; }}
バイナリ ツリーを検索
ステップ 1
データ構造を指す一時変数を作成します:STUDENT_DATA *cur_student;
ステップ 2
一時変数を head 変数に設定します:cur_student =students_head;
ステップ 3
要素をループして、目的の値をチェックします。 }
ステップ 4
左または右に分岐し、見つからない場合はループします。 } そうでなければ { cur_student =cur_student->left; }
ステップ 5
ループが終了するかどうかを確認します。そうであれば、そのアイテムが見つからなかったことを意味します:}return 0;
クリーンアップ
ステップ 1
すべてのオペレーティング システムがこれを自動的に処理するわけではないため、プログラムの終了時にバイナリ ツリーの割り当てを解除します。これは、再帰関数を使用して行うのが最適です:void deallocate_binary_tree(STUDENT_DATA *tree) {
ステップ 2
観察:ツリーがない場合、何もする必要はありません:if (!tree) return;
ステップ 3
左右のサブツリーを再帰的に解放します。 deallocate_binary_tree(tree->left); deallocate_binary_tree(tree->right);
ステップ 4
要素の割り当てを解除すれば完了です:free(tree);}
ヒント
二分木への検索と追加は、再帰を使用して行うこともできます。これは、書くことと維持することははるかに簡単ですが、慣れるまで理解するのは少し難しくなります。実際のデータが存在する 2 番目の C データ構造 (多くの場合、配列またはリンク リスト) へのポインターのみを含むバイナリ ツリーを作成するのが一般的です。各バイナリ ツリーは、リスト データの 1 つのフィールドをすばやく検索するためのインデックスです。
警告
二分木からの削除は、C の非常に複雑なアルゴリズムですが、二分木の多くの用途では、要素が削除されることはありません。