Деревья. Подсчет глубины (высоты) дерева - C (СИ)
Формулировка задачи:
Добрый день! Нужно определить глубину (высоту) дерева. Структура у меня такая :
Помогите, пожалуйста! Спасибо заранее большое
typedef struct tree { int key; char s[100]; struct tree *Left; struct tree *Right; } Tree;
Решение задачи: «Деревья. Подсчет глубины (высоты) дерева»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <malloc.h> typedef struct tree { int key; char s[100]; struct tree* left; struct tree* right; } Tree; int Tree_Add(Tree** tr, int key, const char* s); void Tree_Print(FILE* _out, const Tree* tr); void Tree_Clear(Tree* tr); unsigned int Tree_Height(const Tree* tr); int main(void){ Tree* tr = NULL; Tree_Add(&tr, 32, "Pascal"); Tree_Add(&tr, 26, "Algol"); Tree_Add(&tr, 64, "Lisp"); Tree_Add(&tr, 16, "Snobol"); Tree_Add(&tr, 48, "Cobol"); Tree_Print(stdout, tr); printf("height tree: %u\n", Tree_Height(tr)); Tree_Clear(tr); return 0; } //вставка int Tree_Add(Tree** tr, int key, const char* s){ Tree* p = *tr; while(p != NULL){ if(key < p->key){ tr = &p->left; p = p->left; } else if(key > p->key){ tr = &p->right; p = p->right; } else return 0; } p = (Tree*)malloc(sizeof(Tree)); if(p != NULL){ p->left = p->right = NULL; p->key = key; strcpy(p->s, s); *tr = p; } return (p != NULL); } //печать void Tree_Print(FILE* _out, const Tree* tr){ if(tr != NULL){ if(tr->left != NULL) Tree_Print(_out, tr->left); fprintf(_out, "key: %d Value: %s\n", tr->key, tr->s); if(tr->right != NULL) Tree_Print(_out, tr->right); } } //удаление всех void Tree_Clear(Tree* tr){ if(tr != NULL){ if(tr->left != NULL) Tree_Clear(tr->left); if(tr->right != NULL) Tree_Clear(tr->right); free(tr); } } //высота дерева unsigned int Tree_Height(const Tree* tr){ unsigned int l, r; if(tr != NULL){ l = (tr->left != NULL) ? Tree_Height(tr->left) : 0; r = (tr->right != NULL) ? Tree_Height(tr->right) : 0; return ((l > r) ? l : r) + 1; } return 0; }
Объяснение кода листинга программы
- В программе имеется структура данных
дерево
с названиемTree
. - В структуре
Tree
имеются следующие поля: ключ (key), строка (s), указатель на левое поддерево (left) и указатель на правое поддерево (right). - Функция
Tree_Add
добавляет новый узел в дерево. - Если ключ нового узла меньше ключа текущего узла, то узел вставляется в левое поддерево текущего узла.
- Если ключ нового узла больше ключа текущего узла, то узел вставляется в правое поддерево текущего узла.
- Если ключ нового узла совпадает с ключом текущего узла, то функция возвращает 0.
- Если дерево пустое, то создается новый узел, который становится корнем дерева.
- Функция
Tree_Print
выводит содержимое дерева в консоль. - Если узел не пустой, то рекурсивно вызывается функция
Tree_Print
для его левого и правого поддеревьев. - Затем выводится ключ и значение текущего узла.
- После чего рекурсивно вызывается функция
Tree_Print
для его левого и правого поддеревьев. - Функция
Tree_Clear
удаляет все узлы дерева. - Если узел не пустой, то рекурсивно вызывается функция
Tree_Clear
для его левого и правого поддеревьев. - Затем освобождается память, выделенная под узел.
- Функция
Tree_Height
вычисляет высоту дерева. - Если узел не пустой, то рекурсивно вызывается функция
Tree_Height
для его левого и правого поддеревьев. - Затем возвращается максимальная высота поддеревьев, увеличенная на 1.
- Если узел пустой, то возвращается 0.
- В функции
main
создается экземпляр дерева и заполняется несколькими узлами. - Затем выводится содержимое дерева, вычисляется высота дерева и выводится на экран.
- После чего вызывается функция
Tree_Clear
для очистки дерева и завершения работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д