Найти глубину бинарного дерева - 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
. - Полученное значение является глубиной бинарного дерева и возвращается из функции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д