Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2022, 21:24   #1
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
Восклицание Нужно до завтра подправить код на C++

У меня есть код на 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;

}
Нужно её подправить чтобы она находила глубину бинарного дерева.

Заранее благодарю)))

Последний раз редактировалось BDA; 02.11.2022 в 21:32.
MaxBrat вне форума Ответить с цитированием
Старый 02.11.2022, 21:37   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Во-первых, не вижу смысла в двух if:
Код:
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);
 
    return max(l, r) + 1;
}
А во-вторых, а что не так-то? Результат 5 соответствует глубине дерева.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.11.2022, 22:01   #3
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
По умолчанию

Спасибо большое ))
MaxBrat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно подправить прогу Александр121 Помощь студентам 5 07.11.2017 23:30
Нужно подправить калькулятор VTEC Фриланс 2 08.03.2017 22:12
Нужно подправить код в программе на VB 6. sosed Фриланс 11 20.11.2015 20:21
Нужно подправить код html daniilak Помощь студентам 0 12.11.2013 18:37
Нужно подправить код zeppelin58 Общие вопросы C/C++ 1 28.05.2010 12:11