У меня есть код на C++:
Код:
#include <iostream>
using namespace std;
struct BinaryTree { // структура бинарного дерева
double data;
BinaryTree* left, * right; // указатели на правого и левого потомка элемента
};
BinaryTree* First(double x) { // функция создания корня бинарного дерева
BinaryTree* pv = new BinaryTree;
pv->data = x;
pv->left = 0; // создания указателей на потомков корня дерева
pv->right = 0;
return pv;
}
BinaryTree* Search_Insert(BinaryTree* root, double ai) {
BinaryTree* pv = root, * prev = nullptr;
bool found = false;
while (pv && !found) // цикл для проверки элементов, чтобы узнать куда их ставить
{
prev = pv;
if (ai == pv->data) { // если находится повторяющиеся элемент то возвращается адрес этого элемента в бинарном дереве. в бинарное дерево не вставляются повторяющиеся элементы
found = true;
}
else if (ai < pv->data) { // если элемент-потомок меньше своего родителя то он вставляется в левую ветку
pv = pv->left;
}
else {
pv = pv->right; // если элемент-потомок больше своего родителя то он вставляется в правую ветку
}
}
if (found) {
return pv; // якщо ключ х є у дереві, то повертається його адреса
}
BinaryTree* pnew = new BinaryTree;
pnew->data = ai; // создание нового элемента в дереве и создания указателя на правую и левую ветку
pnew->left = 0;
pnew->right = 0;
if (ai < prev->data) {
prev->left = pnew;
}
else {
prev->right = pnew;
}
return pnew; //повертаємо адресу на новий ключ дерева
}
void Print_BinaryTree(BinaryTree* root, int n) { // функция-рекурсия вывода бинарного дерева в консоль. Прямой обход дерева
if (root != NULL)
{
if (n) {
for (int i = 0; i < n; i++) // цикл по добавлению отступов между элементами
{
cout << " ";
}
}
cout << root->data << endl; // вывод текущего элемента в консоль
if (root->left) { //сначало обходится левая ветка если она есть
Print_BinaryTree(root->left, n + 4); // вызов рекурсии
}
if (root->right) { // потом обходится правая ветка если она есть
Print_BinaryTree(root->right, n + 4); // вызов рекурсии
}
}
}
int Road_to_max(BinaryTree* root) { // Функция для вывода глубины бинарного дерева
// базовый вариант
if (root == nullptr) {
return 0;
}
// найти минимальную глубину левого поддерева
int l = Road_to_max(root->left);
// находим минимальную глубину правого поддерева
int r = Road_to_max(root->right);
// если левого дочернего элемента не существует, считаем глубину
// возвращает правое поддерево
if (root->left == nullptr) {
return 1 + r;
}
// если нужного потомка не существует, учитываем глубину
// возвращает левое поддерево
if (root->right == nullptr) {
return 1 + l;
}
// в противном случае выбираем Максимальную глубину, возвращаемую
// левое и правое поддерево
return max(l, r) + 1;
}
void Delete_BinaryTree(BinaryTree* root) { // функция удаления бинарного дерева
if (root != NULL)
{
Delete_BinaryTree(root->left); // удаление всей левой ветки
Delete_BinaryTree(root->right);// удаление всей правой ветки
delete root; // удаление корня
}
}
int main()
{
setlocale(LC_ALL, "Russian");
BinaryTree* root = NULL; // создания переменной которая будет обозначать корень дерева
int n = 0, left_wing_check = 0;;
double a[10] = { 98, 14, -5, 110, 114, 78, 90, 20, -11, 66 }; // элементы дерева
for (int i = 0; i < 10; i++) { // цикл по созданию дерева
if (root == 0) {
root = First(a[i]); // первый элемент массива является корнем дерева
}
else {
Search_Insert(root, a[i]); // вызов функций для вставки элементов в бинарное дерево
}
}
cout << "Бинарное дерево = " << endl;
Print_BinaryTree(root, n); // вызов функций вывода бинарного дерева в консоль
cout << "The minimum depth is " << Road_to_max(root);
Delete_BinaryTree(root); // вызов функций удаления бинарного дерева
}
_____________________Где есть функция____________________________ _____________________
Код:
int Road_to_max(BinaryTree* root) { // Функция для вывода глубины бинарного дерева
// базовый вариант
if (root == nullptr) {
return 0;
}
// найти минимальную глубину левого поддерева
int l = Road_to_max(root->left);
// находим минимальную глубину правого поддерева
int r = Road_to_max(root->right);
// если левого дочернего элемента не существует, считаем глубину
// возвращает правое поддерево
if (root->left == nullptr) {
return 1 + r;
}
// если нужного потомка не существует, учитываем глубину
// возвращает левое поддерево
if (root->right == nullptr) {
return 1 + l;
}
// в противном случае выбираем Максимальную глубину, возвращаемую
// левое и правое поддерево
return max(l, r) + 1;
}
Нужно её подправить чтобы она находила глубину бинарного дерева.
Заранее благодарю)))