Как создать двоичное дерево на 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 * student = 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. Если переменная head имеет значение NULL, это первый элемент, добавленный к дереву, поэтому установите переменную head так, чтобы она указывала на него, и все готово: if (! Student) {student = 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-> влево;

Сделайте то же самое справа, иначе:} else {if (cur_student-> right == NULL) {cur_student-> right = newstudent; возврат 1; } cur_student = cur_student-> право; }}

Создайте временную переменную, указывающую на структуру данных: 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; } еще {cur_student = cur_student-> left; }

Посмотрите, закончится ли цикл. Если это так, это означает, что вы никогда не нашли элемент:} return 0;

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

Рекурсивно освободить левое и правое поддеревья: deallocate_binary_tree (tree-> left); deallocate_binary_tree (дерево-> вправо);

Поиск и добавление к двоичным деревьям также можно выполнять с помощью рекурсии. Это будет намного проще написать и поддерживать, но немного сложнее понять, пока вы к этому не привыкнете. Обычно создается двоичное дерево, содержащее только указатели на вторую структуру данных C, часто это массив или связанный список, где находятся фактические данные. Каждое двоичное дерево является индексом для быстрого поиска в одном поле данных списка.

Удаление из двоичного дерева - очень сложный алгоритм в C, но во многих случаях использования двоичных деревьев элементы никогда не удаляются.