Создать бинарное дерево с типом узлов 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 для определения типа узла. Список действий, которые происходят в коде:

  1. #include Указывает компилятору включить в программу функции файла стандартного ввода/вывода.
  2. #include Указывает компилятору включить в программу функции файла стандартного ввода/вывода и malloc.
  3. enum item Определяет перечисление (enum) с тремя значениями.
  4. struct node Определяет структуру узла с полями: enum item item; struct node left; struct node right.
  5. struct bin_tree Определяет структуру связного списка с полем root.
  6. *void init(struct bin_tree)** Инициализирует связный список пустым.
  7. struct node insert_node(struct node node, enum item item) Рекурсивная функция для вставки нового узла в дерево. Если узел пуст, то создается новый узел, иначе рекурсивно вызывается функция для левого или правого поддерева в зависимости от значения enum.
  8. *void insert(struct bin_tree, enum item item)** Вставляет новый узел в корень дерева.
  9. *int member_node(const struct node node, enum item item)** Рекурсивная функция для проверки наличия enum в поддереве, начиная с указанного узла.
  10. *int member(const struct bin_tree, enum item item)** Проверяет наличие enum в дереве.
  11. *void destroy_node(struct node node)** Рекурсивная функция для удаления узла и всех его потомков.
  12. *void destroy(struct bin_tree tree)** Удаляет все узлы дерева.
  13. int main(void) Главная функция программы.
  14. enum item items[] = {ITEM2, ITEM1, ITEM2}; Массив для тестовых значений enum.
  15. size_t i; Переменная для итерации по массиву.
  16. struct bin_tree tree; Создание связного списка для хранения дерева.
  17. init(&tree); Инициализация связного списка.
  18. *for(i = 0; i < sizeof(items) / sizeof(items); ++i)** Цикл для добавления всех тестовых значений enum в дерево.
  19. TEST(member(&tree, ITEM1)); Вывод результата проверки наличия первого тестового значения enum в дереве.
  20. TEST(member(&tree, ITEM2)); Вывод результата проверки наличия второго тестового значения enum в дереве.
  21. TEST(member(&tree, ITEM3)); Вывод результата проверки наличия третьего тестового значения enum в дереве.
  22. destroy(&tree); Удаление всех узлов дерева.
  23. exit(0); Завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5
Похожие ответы