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

Класс Бинарное дерево

08.12.2022, 01:02. Показов 1861. Ответов 34

Студворк — интернет-сервис помощи студентам
Здравствуйте. Подскажите, пожалуйста, как реализовать класс Бинарное дерево. Вне кода я понимаю, как бинарное дерево устроено. Но я не знаю, как его реализовать в класс.

Также нужно создать следующие методы: добавить слева, добавить справа, удалить слева и удалить справа. Ну и, для проверки, неплохо бы еще метод с выводом данных, чтобы как-то проверить работоспособность кода)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2022, 01:02
Ответы с готовыми решениями:

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...

Класс бинарное дерево
Здравствуйте. Требуется написать англо-русский словарь на основе бинарного дерева. Не полностью понимаю, как будет выглядеть класс....

Класс, реализующий Бинарное дерево
Добрый день! Как реализовать класс, реализующий Бинарное дерево при помощь с++. Спасибо за внимание

34
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
08.12.2022, 04:15
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
#include <list>
#include <iostream>
 
template<typename T>
struct tree_t {
    T data;
    tree_t(const T& value)
        : data{value} {
    }
    tree_t& emplace_left(const T& value) {
        left.clear();
        left.emplace_back(value);
        return left.front();
    }
    tree_t& emplace_right(const T& value) {
        right.clear();
        right.emplace_back(value);
        return right.front();
    }
    void clear_left() {
        left.clear();
    }
    void clear_right() {
        right.clear();
    }
    bool has_left() const {
        return !left.empty();
    }
    bool has_right() const {
        return !right.empty();
    }
    const tree_t& get_left() const {
        return left.front();
    }
    const tree_t& get_right() const {
        return right.front();
    }
    tree_t& get_left() {
        return left.front();
    }
    tree_t& get_right() {
        return right.front();
    }
private:
    std::list<tree_t> left;
    std::list<tree_t> right;
};
 
template<typename T>
void print_tree(const tree_t<T>& tree, size_t spacing = 0) {
    std::cout << tree.data << std::endl;
    if(tree.has_left()) {
        std::cout << std::string(spacing + 1, ' ') << "L: ";
        print_tree(tree.get_left(), spacing + 1);
    }
    if(tree.has_right()) {
        std::cout << std::string(spacing + 1, ' ') << "R: ";
        print_tree(tree.get_right(), spacing + 1);
    }
}
 
int main(int argc, char *argv[]) {
    tree_t<int> tree{10};
    auto& l1 = tree.emplace_left(5);
    l1.emplace_left(2);
    l1.emplace_right(6);
    auto& r1 = tree.emplace_right(15);
    r1.emplace_left(12);
    r1.emplace_right(17);
    print_tree(tree);
    tree.clear_left();
    print_tree(tree);
 }
0
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
08.12.2022, 08:06  [ТС]
woldemas, Извините, а можно Вас попросить добавить комментарии к методам? Просто в задаче просят реализовать только 4 метода, а у Вас их где-то в 3 раза больше
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
08.12.2022, 10:26
Fershtein, не обращай внимание, это не бинарное дерево. И научись уже 1) гуглить 2) разбираться в том, что находишь, а не бездумно хавать
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
08.12.2022, 11:17
Kuzia domovenok, это самое что ни на есть бинарное дерево.
0
Заблокирован
08.12.2022, 12:23
Цитата Сообщение от woldemas Посмотреть сообщение
это самое что ни на есть бинарное дерево.
Похоже на какую-то ахинею, а не на бинарное дерево.
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
08.12.2022, 12:36
SmallEvil, это обычное бинарное дерево, просто вместо указателя - список из одного элемента (а это по сути и есть указатель). Список, понятное дело, избыточен, но зато бесплатно получаю семантику копирования и присваивания. А так вполне рабочая структура данных.
0
Заблокирован
08.12.2022, 13:48
Цитата Сообщение от woldemas Посмотреть сообщение
это обычное бинарное дерево
Обычное бинарное дерево не содержит никаких данных кроме Узла - корня дерева.
woldemas, теперь попробуйте удалить произвольный элемент дерева.
И так далее и тому подобное, и вы увидите что представленное вами "представление бинарного дерева",
ну никак нельзя назвать обычным.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
08.12.2022, 14:13
Цитата Сообщение от woldemas Посмотреть сообщение
Список, понятное дело, избыточен, но зато бесплатно получаю семантику копирования и присваивания.
В простых примерах, копирование и призвание и не просят делать
А в сложных, возникают проблемы с перемещением узлов, SmallEvil правильно сказал, и с удалением узлов.
то, ради чего дерево затевалось - быстрое выстраивание иерархии становится ненужным.
Тогда уж лучше строить дерево на одномерном массиве,
Code
1
2
3
4
5
[
0=>NULL, 1=>root,
 2=>left_lvl1, 3=>right_lvl1,
 4=>left_lvl1_left_lvl2, 5=>left_lvl1_right_lvl2, 6=>right_lvl1_left_lvl2, 7=>right_lvl1_right_lvl2
]
и обходить его по формуле
левый индекс = текущий индекс*2
правый индекс = текущий индекс*2+1
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
08.12.2022, 14:28
SmallEvil,
Из википедии
Двои́чное де́рево — иерархическая структура данных, в которой каждый узел имеет не более двух потомков (детей). Как правило, первый называется родительским узлом, а дети называются левым и правым наследниками.
Других определений я не знаю. Это прежде всего иерархическая структура и узлы в принципе ничем друг от друга не отличаются. Причем даже не оговаривается как это дерево представляется в программе. Да хоть массивом. Надеюсь про представлении бинарного дерева линейным массивом вы хоть слышали? Оно тоже "обычное". Бинарное дерево - это абстрактная структура данных, а не то что вам показали когда-то на лекции и сказали, что именно это и есть бинарное дерево.

Добавлено через 11 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В простых примерах, копирование и призвание и не просят делать
Понятно, что для каждой задачи свое. Но это была просто иллюстрация разнообразия этого мира.
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Тогда уж лучше строить дерево на одномерном массиве
Я в курсе.

Добавлено через 2 минуты
А моя реализация вполне годится для ситуаций, например, когда надо дерево построить один раз или загрузить готовое из файла а потом по нему пробегать с поиском.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
08.12.2022, 14:34
Цитата Сообщение от woldemas Посмотреть сообщение
А моя реализация вполне годится для ситуаций, например, когда надо дерево построить один раз или загрузить готовое из файла а потом по нему пробегать с поиском.
А если ситуация -
когда надо дерево построить один раз или загрузить готовое из файла
сбалансировать его,
а потом по нему пробегать с
ещё более эффективным поиском?
0
Заблокирован
08.12.2022, 14:38
Цитата Сообщение от woldemas Посмотреть сообщение
Бинарное дерево - это абстрактная структура данных, а не то что вам показали когда-то на лекции и сказали, что именно это и есть бинарное дерево.
Браво, прям с пенкой вылазит
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
08.12.2022, 14:39
Kuzia domovenok, тогда пишем другое дерево. И дольше чем 5 минут. Очевидно же.
0
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
08.12.2022, 15:17  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
1) гуглить 2) разбираться в том, что находишь, а не бездумно хавать
Гуглил. Но я нигде не смог найти ПОЛНЫЙ код с добавлением, удалением и копированием элементов и с пояснением к каждому моменту.

А если и где-то было, то методы были не совсем те, которые мне нужны по условию
0
Заблокирован
08.12.2022, 16:22
Fershtein, берите "обычное бинарное дерево" от woldemas.
Расскажете как сдали
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
08.12.2022, 16:24
Fershtein, это сарказм если что. Я б на месте препода не принял
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.12.2022, 16:49
Цитата Сообщение от Fershtein Посмотреть сообщение
Гуглил. Но я нигде не смог найти ПОЛНЫЙ код с добавлением, удалением и копированием элементов и с пояснением к каждому моменту.
А что такое "копирование элементов" по отношению к бинарному дереву?
0
Заблокирован
08.12.2022, 17:00
Лучший ответ Сообщение было отмечено Fershtein как решение

Решение

Цитата Сообщение от Fershtein Посмотреть сообщение
Также нужно создать следующие методы: добавить слева, добавить справа, удалить слева и удалить справа. Ну и, для проверки, неплохо бы еще метод с выводом данных, чтобы как-то проверить работоспособность кода)
Валялся у меня код такого уровня, немного подправил.
Смотрю на это и думаю, чего же все таки детей учат.

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
104
105
106
107
108
109
110
#include <iostream>
using namespace std;
template<typename D>
struct TNode{
    D     data{};
    TNode* left  = nullptr;
    TNode* right = nullptr;
    TNode() = default;
    TNode(D data):data{data}{};
    ~TNode(){
        if (left) delete left;
        if (right) delete right;
    };
};
template<typename T>
class MyBTree{
private:
    using Node = TNode<T>;
    Node* root      = nullptr;   // корень дерева
public:
    Node* SetRoot(const T& data){
        if (root == nullptr)
            root = new Node(data);
        return root;
    };
    void Delete(Node * to, bool left){
        if (left){
            delete to->left;
            to->left = nullptr;
        }else
        if (left){
            delete to->right;
            to->right = nullptr;
        }
    }
    Node * Add(Node * to, const T& data, bool left){
        if ( to )
        {
            if (left){
                if (!(to->left))
                   return to->left = new Node(data);
            }
            else
                if (!(to->right))
                   return to->right = new Node(data);
        }
        return to;
    }
    void Add(Node * to, const T& left_data, const T& right_data){
        if (to){
            Add(to, left_data, true);
            Add(to, right_data, false);
        }
    }   
    Node * Root() const{
        return root;
    };
    void SimplePrint() const{
        SimplePrint(root);
    }
    void SimplePrint(const Node * curr, unsigned level=0) const{
        if (curr) {
            SimplePrint(curr->left, level + 1);
            for (unsigned i = 0; i < level; i++)
                cout << "    ";
            cout << curr->data << endl;
            SimplePrint(curr->right, level + 1);
        }
    };
   ~MyBTree(){
       delete root;
   }
};
 
 
int main()
{
    MyBTree<int> tree;
    struct auto_counter{
        int c{};
        operator int(){return ++c;};
    };
    auto_counter counter;
    using Node = TNode<int>;
    Node * n1, * n2, * n3;
    // <<-- Построение дерева -->>//
    n1 = tree.SetRoot(counter);
    n2 = tree.Add(n1, counter, true);
    tree.Add(n2, counter, false);
    n1 = tree.Add(tree.Root(), counter, false);
    n2 = tree.Add(n1, counter, true);
    n3 = tree.Add(n2, counter, true);
    tree.Add(n3, counter, true);
 
    tree.Add(n2, counter, counter);
    tree.Add(n1, counter, false);
    tree.Add(n3, counter, counter);
    // <<-- Дерево построенно -->>//
    cout << "Tree : " << endl;
    cout << "===============================" << endl;
    tree.SimplePrint();
    cout << "===============================" << endl;
    cout << "Delete some nodes(tree)." << endl;
    tree.Delete(n1, true);
    tree.Delete(n1, false);
    cout << "Tree : " << endl;
    cout << "===============================" << endl;
    tree.SimplePrint();
    cout << "===============================" << endl;
}
Добавлено через 3 минуты
Цитата Сообщение от Fershtein Посмотреть сообщение
и с пояснением к каждому моменту
Какое вы там описание ожидаете ?
1
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
08.12.2022, 17:01
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Я б на месте препода не принял
А я бы принял.
Ну заменить list на смарт или голые указатели - и вперед. И сетеры и гетерами соответственно.
0
Заблокирован
08.12.2022, 17:07
woldemas, я бы тоже принял, если бы дерево было деревом.
Но это не так.

С какого перепугу дерево имеет данные ?
Цитата Сообщение от woldemas Посмотреть сообщение
struct tree_t {
    T data;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2022, 17:07
Помогаю со студенческими работами здесь

Описать класс, реализующий бинарное дерево
помогите ..ребят знаю что обсуждалось уже кучу раз..но у мне выдаёт ошибки..разобраться не могу..эту роботу должна сдать очень скоро..(( ...

Нужно реализовать класс Бинарное дерево.
Нужно реализовать класс Бинарное дерево. Вот класс template &lt;class T&gt; class Tree { private: class Item{ friend Tree; ...

Описать класс, реализующий бинарное дерево
Описать класс, реализующий бинарное дерево, обладающее возможностью добавления новых элементов, удаления существующих, поиска элемента по...

Описать класс, реализующий бинарное дерево
Здравствуйте! Возникли проблемы с реализацией одной программы ....Описать класс, реализующий бинарное дерево, обладающее возможностью...

Создать шаблонный класс «бинарное дерево»
Создать шаблон класса «бинарное дерево». Использовать его для сортировки целых чисел и строк, задаваемых с клавиатуры Можно простой код...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru