Создать бинарное дерево с типом узлов enum - C (СИ)
Формулировка задачи:
нужно создать бинарное дерево с типом узов enum
как будет выглядить структура и создание такого дерева?
Решение задачи: «Создать бинарное дерево с типом узлов enum»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
enum item
{
ITEM1, ITEM2, ITEM3
};
struct node
{
enum item item;
struct node* left;
struct node* right;
};
struct bin_tree
{
struct node* root;
};
void init(struct bin_tree*);
void insert(struct bin_tree*, enum item);
int member(const struct bin_tree*, enum item);
void destroy(struct bin_tree*);
#define TEST(EXPR) printf(#EXPR ": %s\n", ((EXPR) != 0 ? "true" : "false"))
int main(void)
{
enum item items[] = {ITEM2, ITEM1, ITEM2};
size_t i;
struct bin_tree tree;
init(&tree);
for(i = 0; i < sizeof(items) / sizeof(*items); ++i)
insert(&tree, items[i]);
TEST(member(&tree, ITEM1));
TEST(member(&tree, ITEM2));
TEST(member(&tree, ITEM3));
destroy(&tree);
exit(0);
}
void init(struct bin_tree* tree)
{
tree->root = NULL;
}
struct node* insert_node(struct node* node, enum item item)
{
if(node == NULL)
{
node = malloc(sizeof(struct node));
node->left = node->right = NULL;
node->item = item;
}
else if(item < node->item)
node->left = insert_node(node->left, item);
else if(item > node->item)
node->right = insert_node(node->right, item);
return node;
}
void insert(struct bin_tree* tree, enum item item)
{
tree->root = insert_node(tree->root, item);
}
int member_node(const struct node* node, enum item item)
{
if(node == NULL)
return 0;
if(item < node->item)
return member_node(node->left, item);
if(item > node->item)
return member_node(node->right, item);
return 1;
}
int member(const struct bin_tree* tree, enum item item)
{
return member_node(tree->root, item);
}
void destroy_node(struct node* node)
{
if(node != NULL)
{
destroy_node(node->left);
destroy_node(node->right);
free(node);
}
}
void destroy(struct bin_tree* tree)
{
destroy_node(tree->root);
tree->root = NULL;
}
Объяснение кода листинга программы
В данном коде реализована реализация двоичного дерева с использованием enum для определения типа узла. Список действий, которые происходят в коде:
- #include
Указывает компилятору включить в программу функции файла стандартного ввода/вывода. - #include
Указывает компилятору включить в программу функции файла стандартного ввода/вывода и malloc. - enum item Определяет перечисление (enum) с тремя значениями.
- struct node Определяет структуру узла с полями: enum item item; struct node left; struct node right.
- struct bin_tree Определяет структуру связного списка с полем root.
- *void init(struct bin_tree)** Инициализирует связный список пустым.
- struct node insert_node(struct node node, enum item item) Рекурсивная функция для вставки нового узла в дерево. Если узел пуст, то создается новый узел, иначе рекурсивно вызывается функция для левого или правого поддерева в зависимости от значения enum.
- *void insert(struct bin_tree, enum item item)** Вставляет новый узел в корень дерева.
- *int member_node(const struct node node, enum item item)** Рекурсивная функция для проверки наличия enum в поддереве, начиная с указанного узла.
- *int member(const struct bin_tree, enum item item)** Проверяет наличие enum в дереве.
- *void destroy_node(struct node node)** Рекурсивная функция для удаления узла и всех его потомков.
- *void destroy(struct bin_tree tree)** Удаляет все узлы дерева.
- int main(void) Главная функция программы.
- enum item items[] = {ITEM2, ITEM1, ITEM2}; Массив для тестовых значений enum.
- size_t i; Переменная для итерации по массиву.
- struct bin_tree tree; Создание связного списка для хранения дерева.
- init(&tree); Инициализация связного списка.
- *for(i = 0; i < sizeof(items) / sizeof(items); ++i)** Цикл для добавления всех тестовых значений enum в дерево.
- TEST(member(&tree, ITEM1)); Вывод результата проверки наличия первого тестового значения enum в дереве.
- TEST(member(&tree, ITEM2)); Вывод результата проверки наличия второго тестового значения enum в дереве.
- TEST(member(&tree, ITEM3)); Вывод результата проверки наличия третьего тестового значения enum в дереве.
- destroy(&tree); Удаление всех узлов дерева.
- exit(0); Завершение программы.