Найти глубину бинарного дерева - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет. Нужно найти глубину бинарного дерева, пробовал разные способы отсюда и не только, не получается никак. При заданном способе вообще ничего не выводится. Прога написана частями на с++, т.к. брал некоторые куски из разных источников. Функция для определения глубины getMaxDepth
#define _CRT_SECURE_NO_WARNINGS
# include <iostream>
# include <conio.h>
# include <stdio.h>
# include <stdlib.h>
# include <windows.h>
//#include <algorithm>
 
#define FALSE 0
#define TRUE 1
using namespace std;
 
struct STree {
    int info;
    STree *Left, *Right;
    STree *Root;
};
 
STree* List(int i);
STree* Make(STree *Root);
STree* Del(STree *Root, int key);
void View(STree *t, int level);
void Del_All(STree *t);
int getMaxDepth(STree*t, int depth);
STree *Search(STree *Root, int key);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    STree *Root = NULL;
    int done = FALSE;
    char c;
    int key;
 
    while (!done) {
        printf("Меню:\n"
            "1) Создать дерево\n"
            "2) Добавить ключ\n"
            "3) Поиск по ключу\n"
            "4) Удаление по ключу\n"
            "5) Показать дерево\n"
            "6) Глубина дерева\n"
            "7) Завершение программы\n");
 
        c = _getch();
        switch (toupper(c)) {
        case '1':
            Root = Make(Root);
            break;
        case '2':
            Root = Make(Root);
            break;
        case '3':
            printf("\n\tВведите ключ\n");
            cin >> key;
            Root = Search(Root, key);
            break;
        case'4':
            printf("\n\tВведите ключ\n");
            cin >> key;
            Root = Del(Root,key);
            break;
        case '5':
            View(Root, 0);
            break;
        case'6':
             getMaxDepth(Root,0);
            break;
        case '7':
            Del_All(Root);
            done = TRUE;
            break;
 
        default:
            printf("\n\aНекорректный ввод!\n");
        }
 
    }
    return 0;
}
 
STree* Make(STree *Root)
{
    STree *Prev = NULL, *t;
    int b, find;
    if (Root == NULL)
    {
        printf("Создание дерева");
        printf("\n\tВведите корень\n");
        cin >> b;
        Root = List(b);
    }
    while (1)
    {
        printf("\nВведите следующую ветвть\n");
        cin >> b;
        if (b<0) break;
        t = Root;
        find = 0;
        while (t && !find)
        {
            Prev = t;
            if (b == t->info)
                find = 1;
            else
                if (b < t->info) t = t->Left;
                else
                    t = t->Right;
        }
        if (!find)
        {
            t = List(b);
            if (b < Prev->info)
                Prev->Left = t;
            else
                Prev->Right = t;
        }
    }
    return Root;
}
 
STree* List(int i)
{
    STree *t = new STree;
    t->info = i;
    t->Left = t->Right = NULL;
    return t;
}
 
STree* Del(STree *Root, int key)
{
    STree *Del, *Prev_Del, *R, *Prev_R;
    Del = Root;
    Prev_Del = NULL;
    while (Del != NULL &&Del->info != key)
    {
        Prev_Del = Del;
        if (Del->info > key)
            Del = Del->Left;
        else Del = Del->Right;
 
    }
    if (Del == NULL)
    {
        printf("\n\t\aКлюч не найден!\n");
        return Root;
    }
    if (Del->Right == NULL)
        R = Del->Left;
    else if (Del->Left == NULL)
        R = Del->Right;
    else
 
    {
        Prev_R = Del;
        R = Del->Left;
        while (R->Right != NULL)
        {
            Prev_R = R;
            R = R->Right;
 
        }
        if (Prev_R == Del)
            R->Right = Del->Right;
        else {
            R->Right = Del->Right;
            Prev_R->Right = R->Left;
            R->Left = Prev_R;
 
        }
    }
    if (Del == Root)
        Root = R;
    else if (Del->info < Prev_Del->info)
        Prev_Del->Left = R;
    else Prev_Del->Right = R;
    cout << "\nУдаляемый ключ - " << Del->info << endl;
    delete Del;
    return Root;
}
 
void View(STree *t, int level)
{
    if (t)
    {
        View(t->Right, level + 1);
        for (int i = 0; i<level; i++)
            cout << " ";
        cout << t->info << endl;
        View(t->Left, level + 1);
    }
}
 
void Del_All(STree *t)
{
    if (t != NULL)
    {
        delete(t->Left);
        delete(t->Right);
        delete t;
    }
}
 
int getMaxDepth(STree*t, int depth)
{
    if (t == NULL)
return depth;
    else
return max(getMaxDepth(t->Left, depth + 1), getMaxDepth(t->Right, depth + 1));
printf("гЛУБИНА ДЕРЕВА %d",depth);
}
 
STree *Search(STree *Root, int key)
{
    STree *Del, *Prev_Del, *R, *Prev_R;
    Del = Root;
    Prev_Del = NULL;
    while (Del != NULL &&Del->info != key)
    {
        Prev_Del = Del;
        if (Del->info > key)
            Del = Del->Left;
        else Del = Del->Right;
 
    }
 
    if (Del == NULL)
    {
        printf("\n\t\aКлюч Не найден!\n");
        return Root;
    }
    cout << "Искомый ключ - " << Del->info << endl;
    return Root;
}

Решение задачи: «Найти глубину бинарного дерева»

textual
Листинг программы
int getMaxDepth(STree *t)
{
    if (t == NULL)
        return 0;
    return max(getMaxDepth(t->Left), getMaxDepth(t->Right)) + 1;
}

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

  1. Функция getMaxDepth принимает в качестве параметра указатель на узел бинарного дерева t.
  2. Если переданный узел t равен NULL, то функция возвращает 0, что означает отсутствие узла или пустое дерево.
  3. В противном случае, функция использует функцию max для нахождения максимального значения глубины поддерева, которое получается при рекурсивном вызове функции getMaxDepth для левого и правого поддеревьев узла t.
  4. Полученное максимальное значение глубины поддерева увеличивается на 1, так как каждый узел является вершиной поддерева глубины 1.
  5. Полученное значение является глубиной бинарного дерева и возвращается из функции.

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


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

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

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