Найти глубину бинарного дерева - 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;
}
Объяснение кода листинга программы
- Функция
getMaxDepthпринимает в качестве параметра указатель на узел бинарного дереваt. - Если переданный узел
tравенNULL, то функция возвращает0, что означает отсутствие узла или пустое дерево. - В противном случае, функция использует функцию
maxдля нахождения максимального значения глубины поддерева, которое получается при рекурсивном вызове функцииgetMaxDepthдля левого и правого поддеревьев узлаt. - Полученное максимальное значение глубины поддерева увеличивается на
1, так как каждый узел является вершиной поддерева глубины1. - Полученное значение является глубиной бинарного дерева и возвращается из функции.