Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/22: Рейтинг темы: голосов - 22, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38

Бинарные деревья, С++

17.03.2021, 16:38. Показов 4276. Ответов 22

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня тут такое задание, не могли бы помочь?
Написать рекурсивную функцию, которая определяет глубину заданного элемента на дереве и возвращает –1, если такого элемента нет. c++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <ctime>
#include <string>
 
using namespace std;
struct Tree {
    int data;
    Tree* left, * right;
};
void add(int x, Tree*& p)
{
    int i = rand() % 2;
 
    if (p == NULL)
    {
        p = new Tree;
        p->data = x;
        p->right = p->left = NULL;
        return;
    }
 
    if (i == 0) add(x, p->right);
    else add(x, p->left);
}
int element_depth(int b, Tree*& p, int depth) {
    if (p != NULL) {
        depth++;
        if (b == p->data)
            return depth;
        else {
            int d;
            d = element_depth(b, p->left, depth);       // сначала рекурсивный обход левого поддерева
            if (d == -1)                                // не нашли?
                d = element_depth(b, p->right, depth);  // тогда рекурсивный обход правого поддерева
            return d;
        }
    }
 
    else
        return -1;
}
Я вот понял, что функции int main() не хватает, но какое условие прописать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2021, 16:38
Ответы с готовыми решениями:

Бинарные деревья
Имею три файла: Скажите пожалуйста почему я не могу создать э-т m?(Класс tree) Он мне пишет - undefined reference to...

Бинарные деревья
Вот задачка: Для заданного бинарного дерева поиска проверить условие: • для каждой вершины высота левого поддерева отличается от...

Бинарные деревья
Подсчитать количество элементов на n-уровне бинарного дерева. Подскажите как можно решить используя любой обход в глубину но без...

22
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.03.2021, 19:26
Цитата Сообщение от Ghead Посмотреть сообщение
Я вот понял, что функции int main() не хватает, но какое условие прописать?
Никакое. Просто нужна функция main(), в которой будут вызываться твои функции и выводится результаты.
0
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38
17.03.2021, 19:30  [ТС]
А где вписать саму главную функцию?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.03.2021, 19:33
Лучший ответ Сообщение было отмечено Ghead как решение

Решение

Цитата Сообщение от Ghead Посмотреть сообщение
А где вписать саму главную функцию?
В самом конце
C++
1
2
3
4
5
6
7
8
9
.........................
    else
        return -1;
}
 
int main()
{
здесь ввод данных - добавление их в список - расчёты - вывод результатов
}
1
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38
17.03.2021, 20:15  [ТС]
А где вписать саму главную функцию?oleg-m1973,

Добавлено через 24 секунды
Спасибоoleg-m1973,

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
       return -1;
    }
    int main()
    {
        int n;
        int a;
        
        cout << "Enter N: ";
        cin >> n;
        while (--n > -1)
        {
            cin >> a;
           
        }
        
    }
oleg-m1973, Я получается ввожу данные, как теперь список вписать, тут я затрудняюсь, не поможете?

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      else
            return -1;
    }
    int main()
    {
        int n;
        int a;
        
        cout << "Enter N: ";
        cin >> n;
        while (--n > -1)
        {
            cin >> a;
            cout << a<<" ";
        }
        return -1;
    }
Всё, я додумался, но всё равно вам спасибо.

Добавлено через 2 минуты
oleg-m1973, А почему вот главная функция только работает?

Добавлено через 30 минут
Помогите прошу. oleg-m1973,
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.03.2021, 20:21
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main()
{
    int n;
    int a;
        
    Tree *root = nullptr;
 
    cout << "Enter N: ";
    cin >> n;
    while (--n > -1)
    {
        cin >> a;
        add(a, root);   
    }
 
    cout << "Enter X: ";
    cin >> a;
 
    std::cout << element_depth(a, root, 0) << std::endl;
    return -1;
}
0
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38
17.03.2021, 20:56  [ТС]
oleg-m1973, Спасибо большое вам! Как бы я без вас.. Правда ещё один вопрос есть, мы получается вводим n- количество элементов, а вот X для чего, именно как находиться сама глубина элемента дерева?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
17.03.2021, 21:00
Лучший ответ Сообщение было отмечено Ghead как решение

Решение

Цитата Сообщение от Ghead Посмотреть сообщение
мы получается вводим n- количество элементов, а вот X для чего, именно как находиться сама глубина элемента дерева?
У тебя в задании сказано
Цитата Сообщение от Ghead Посмотреть сообщение
Написать рекурсивную функцию, которая определяет глубину заданного элемента на дереве и возвращает
Глубину заданного элемента - это расстояние от вершины дерева до элемента со значением X, если такой есть.
1
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38
17.03.2021, 21:37  [ТС]
Огромнейшее вам спасибо!!!
0
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38
18.03.2021, 15:45  [ТС]
oleg-m1973, Здравствуйте, в общем-то я тут переделал код, проверите?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <ctime>
#include <string>
 
using namespace std;
    //структура дерева
struct Tree {
    int data;
    Tree* left, * right;
};
void show(Tree*& root)              //Функция обхода
{
    if (root != NULL)               //Пока не встретится пустое звено
    {
        show(root->left);               //Рекурсивная функция для вывода левого поддерева
        cout << root->data << '\t';               //Отображаем корень дерева
        show(root->right);               //Рекурсивная функци для вывода правого поддерева
    }
}
 
/*Добавили очистку памяти*/
void del(Tree*& root) {
    if (root != NULL)                //Пока не встретится пустое звено
    {
        del(root->left);                //Рекурсивная функция прохода по левому поддереву
        del(root->right);                //Рекурсивная функци для прохода по правому поддереву
        delete root;                 //Убиваем конечный элемент дерева
        root = NULL;                 //Может и не обязательно, но плохого не будет
    }
 
}
    //формирование дерева выполняется случайным образом
    void add(int x, Tree * &p)
        {
            if (p == NULL)
            {
                p = new Tree;
                p->data = x;
                p->right = p->left = NULL;
                
            }
            if (x < p->data)               //Если нововведенный элемент x меньше чем элемент x из семечка дерева, уходим влево
            {
                if (p->left != NULL) add(x, p->left); //При помощи рекурсии заталкиваем элемент на свободный участок
                else                      //Если элемент получил свой участок, то
                {
                    p->left = new Tree;                 //Выделяем память левому подзвену. Именно подзвену, а не просто звену
                    p->left->left = p->left->right = NULL;   //У левого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
                    p->left->data = x;                     //Записываем в левое подзвено записываемый элемент
                }
            }
 
            if (x > p->data)          //Если нововведенный элемент x больше чем элемент x из семечка дерева, уходим вправо
            {
                if (p->right != NULL) add(x, p->right); //При помощи рекурсии заталкиваем элемент на свободный участок
                else                                          //Если элемент получил свой участок, то
                {
                    p->right = new Tree;                 //Выделяем память правому подзвену. Именно подзвену, а не просто звену
                    p->right->left = p->right->right = NULL;   //У правого подзвена будут свои левое и правое подзвенья, инициализируем их пустотой
                    p->right->data = x;                     //Записываем в правое подзвено записываемый элемент
                }
            }
    }
 
    int element_depth(int b, Tree * &p, int depth) {
        if (p != NULL) {
            depth++;
            if (b == p->data)
                return depth;
            else {
                int d;
                d = element_depth(b, p->left, depth);       // сначала рекурсивный обход левого поддерева
                if (d == -1)                                // если не нашли тот самый элемент
                    d = element_depth(b, p->right, depth);  // тогда рекурсивный обход правого поддерева
                return d;
            }
        }
        else
            return -1;
    }
    int main()
    {
        int n,i;
        int a;
        Tree* root = nullptr;//присваиваем адрес 0 к кореню дерева
        for (i = 20; i > 5; i--) i = rand() % 100; add(i, root);        //На месте спиленного дерева можно растить новое
        show(root);                       //Смотрим, что выросло
        del(root);
        
        cout << "Enter N: ";
        cin >> n;
        while (--n > -1)
        {
            cin >> a;
            add(a, root);
        }
 
        cout << "Enter A: ";
        cin >> a;
 
        cout << element_depth(a, root, 0) << endl;//вывод глубины выбранного элемента
        return -1;
    }
Тут я ввёл еще цикл.

Добавлено через 4 минуты
oleg-m1973, и вообще можно с циклом выполнить задание в int main, для чего нам i-тый элемент?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.03.2021, 15:50
Цитата Сообщение от Ghead Посмотреть сообщение
oleg-m1973, Здравствуйте, в общем-то я тут переделал код, проверите?
Вроде всё нормально

Добавлено через 29 секунд
Цитата Сообщение от Ghead Посмотреть сообщение
oleg-m1973, и вообще можно с циклом выполнить задание в int main, для чего нам i-тый элемент?
В смысле?
0
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38
18.03.2021, 16:10  [ТС]
oleg-m1973, Ну, для чего это строка нужна?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void add(int x, Tree*& p)
        {
        int i = rand() % 2;
 
        if (p == NULL)
        {
            p = new Tree;
            p->data = x;
            p->right = p->left = NULL;
            return;
        }
 
        if (i == 0) add(x, p->right);
        else add(x, p->left);
    }
где i элемент мы инициализируем?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.03.2021, 16:26
Цитата Сообщение от Ghead Посмотреть сообщение
oleg-m1973, Ну, для чего это строка нужна?
Ни для чего, можешь убрать
0
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
18.03.2021, 16:28
Ghead, для случайного выбора направления добавления элемента если i четный, то вправо add(x, p->right), иначе влево add(x, p->left)
2
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.03.2021, 16:43
Цитата Сообщение от Annemesski Посмотреть сообщение
Ghead, для случайного выбора направления добавления элемента если i четный, то вправо add(x, p->right), иначе влево add(x, p->left)
Да, ошибся. Думал, это сортированноое дерево, а оно просто заполняется в случайном порядке
Ghead, Добавь там srand в main, чтоб случайные числа каждый раз другие были
C++
1
2
3
4
5
6
    int main()
    {
srand(time(0));
        int n,i;
        int a;
        Tree* root = nullptr;//присваиваем адрес 0 к кореню дерева
1
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38
18.03.2021, 16:45  [ТС]
Annemesski, А мне нужно чтобы числа которые больше элемента стоящего на ветке шли вправо, а влево которые меньше того элемента и найти так глубину.

Добавлено через 2 минуты
oleg-m1973, Так тут же отбираются четные числа, которые уходят вправо, а нечетные видимо влево, а мне надо наоборот нужно чтобы числа которые больше элемента стоящего на ветке шли вправо, а влево которые меньше того элемента и найти так глубину.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.03.2021, 16:56
Лучший ответ Сообщение было отмечено Ghead как решение

Решение

Цитата Сообщение от Ghead Посмотреть сообщение
oleg-m1973, Так тут же отбираются четные числа, которые уходят вправо, а нечетные видимо влево, а мне надо наоборот нужно чтобы числа которые больше элемента стоящего на ветке шли вправо, а влево которые меньше того элемента и найти так глубину.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void add(int x, Tree*& p)
{
    if (p == NULL)
    {
        p = new Tree;
        p->data = x;
        p->right = p->left = NULL;
    }
    else if (x < p->data) 
        add(x, p->left);
    else
        add(x, p->right);
}
1
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38
18.03.2021, 17:23  [ТС]
oleg-m1973, а схематически как выглядит само дерево?(чтобы понять работает или нет).
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
18.03.2021, 19:30
Цитата Сообщение от Ghead Посмотреть сообщение
oleg-m1973, а схематически как выглядит само дерево?(чтобы понять работает или нет).
Попробуй нарисовать его вот так, может понятней будет
C++
1
2
3
4
5
6
7
8
9
void show(Tree*& root, std::string tabs = {})              //Функция обхода
{
    if (root != NULL)               //Пока не встретится пустое звено
    {
        show(root->left, tabs + ".");               //Рекурсивная функция для вывода левого поддерева
        cout << tabs << root->data << std::endl;               //Отображаем корень дерева
        show(root->right, tabs + ".");               //Рекурсивная функци для вывода правого поддерева
    }
}
0
1 / 1 / 0
Регистрация: 26.11.2020
Сообщений: 38
18.03.2021, 21:11  [ТС]
oleg-m1973, А где можно посмотреть построение само, я просто новичок в этом деле, в отладчике?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2021, 21:11
Помогаю со студенческими работами здесь

Бинарные деревья
Выведите номера вершин, у которых количество потомков в левом поддереве не равно количеству потомков в правом поддереве. int...

Бинарные деревья
Очень нужна помощь, вообще деревья не понимаю!!!:( Вершина дерева содержит указатель на строку и N указателей на потомков. Функция...

бинарные деревья
Вершина двоичного дерева содержит указатель на строку и указатели на правое и левое поддеревья. Строки в дереве упорядочены по возрастанию....

Бинарные деревья
Компилятор выдаёт ошибки в 9, 10 и 12, 13 строках: invalid conversion from 'int' to 'sNode*' Подскажите пожалуйста, что не так. ...

Бинарные деревья
Доброго времени суток, нужна помощь, дали задание...Вершина бинарного дерева содержит ключ, строку и два указателя на потомков.Составить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru