Деревья. Подсчет глубины (высоты) дерева - 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для очистки дерева и завершения работы программы.