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

Объяснение кода листинга программы

  1. В программе имеется структура данных дерево с названием Tree.
  2. В структуре Tree имеются следующие поля: ключ (key), строка (s), указатель на левое поддерево (left) и указатель на правое поддерево (right).
  3. Функция Tree_Add добавляет новый узел в дерево.
  4. Если ключ нового узла меньше ключа текущего узла, то узел вставляется в левое поддерево текущего узла.
  5. Если ключ нового узла больше ключа текущего узла, то узел вставляется в правое поддерево текущего узла.
  6. Если ключ нового узла совпадает с ключом текущего узла, то функция возвращает 0.
  7. Если дерево пустое, то создается новый узел, который становится корнем дерева.
  8. Функция Tree_Print выводит содержимое дерева в консоль.
  9. Если узел не пустой, то рекурсивно вызывается функция Tree_Print для его левого и правого поддеревьев.
  10. Затем выводится ключ и значение текущего узла.
  11. После чего рекурсивно вызывается функция Tree_Print для его левого и правого поддеревьев.
  12. Функция Tree_Clear удаляет все узлы дерева.
  13. Если узел не пустой, то рекурсивно вызывается функция Tree_Clear для его левого и правого поддеревьев.
  14. Затем освобождается память, выделенная под узел.
  15. Функция Tree_Height вычисляет высоту дерева.
  16. Если узел не пустой, то рекурсивно вызывается функция Tree_Height для его левого и правого поддеревьев.
  17. Затем возвращается максимальная высота поддеревьев, увеличенная на 1.
  18. Если узел пустой, то возвращается 0.
  19. В функции main создается экземпляр дерева и заполняется несколькими узлами.
  20. Затем выводится содержимое дерева, вычисляется высота дерева и выводится на экран.
  21. После чего вызывается функция Tree_Clear для очистки дерева и завершения работы программы.

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


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

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

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