Як створити двійкове дерево в C

click fraud protection

Структуруйте своє бінарне дерево. Кожному бінарному дереву потрібна структура, навіть якщо воно має лише одну змінну. Виберіть ім'я, а потім використовуйте typedef для його створення: typedef struct student_data STUDENT_DATA;

Визначте структуру. Включіть два покажчики на ту саму структуру: struct student_data { int student_ID; int student_grade; STUDENT_DATA ліворуч, праворуч;};

Призначте покажчик на цю структуру даних, ініціалізувавши її на NULL, щоб бути головою дерева: STUDENT_DATA *students = NULL;

Виділіть два тимчасові покажчики на структуру даних: STUDENT_DATA новий_студент, cur_student;

Використовуйте malloc(), щоб створити новий елемент, завжди перевіряючи наявність помилки: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }

Заповніть поля нового елемента. Встановіть для лівого та правого полів значення NULL: new_student->student_ID = newID; new_student->student_size = розмір новини; 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 < cur_student->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;

Звільніть бінарне дерево, коли ваша програма закінчиться, оскільки не всі операційні системи оброблятимуть це автоматично. Найкраще це зробити за допомогою рекурсивної функції: void deallocate_binary_tree (STUDENT_DATA *tree) {

Рекурсивно зніміть ліве та праве піддерева: deallocate_binary_tree (tree->left); delocate_binary_tree (дерево->праворуч);

Пошук і додавання до бінарних дерев також можна виконувати за допомогою рекурсії. Це буде набагато легше писати та підтримувати, але трохи важче зрозуміти, поки ви не звикнете. Зазвичай створюють двійкове дерево, яке містить лише вказівники на другу структуру даних C, часто на масив або зв’язаний список, де знаходяться фактичні дані. Кожне двійкове дерево є індексом для швидкого пошуку в одному полі даних списку.

Видалення з двійкового дерева є дуже складним алгоритмом в C, але в багатьох випадках використання двійкових дерев елементи ніколи не видаляються.