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

Нужно реализовать класс Бинарное дерево.

25.01.2014, 12:28. Показов 2776. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно реализовать класс Бинарное дерево.
Вот класс
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
template <class T> class Tree
{
private:
    class Item{
        friend Tree;
        Item* parent;
        Item* left;
        Item* right;
        T value;
        Item(T value, Item* parent, Item* left = nullptr, Item* right = nullptr) { value(value), parent(parent), left(left), right(right) }
    };
 
    Item* root;
 
    void Add(T& value, Item* ptr)
    {
        if (ptr->value > value)
        {
            if (ptr->left)
            {
                Add(value, ptr->Add);
            }
            else
            {
                ptr->left = new Item(value, ptr);
            }
        }
        else
        {
            if (ptr->right)
            {
                Add(value, ptr->right);
            }
            else
            {
                ptr->right = new Item(value, ptr);
            }
        }
    }
    void Print(Item* ptr)
    {
        
        if (ptr->left)Print(ptr->left);
        cout << ptr->value << "; ";
        if (ptr->right)Print(ptr->right);
    }
 
    void Destroy(Item* ptr)
    {
        if (ptr->left)Destroy(ptr->left);
        if (ptr->right)Destroy(ptr->right);
        delete ptr;
    }
 
public:
    Tree() :root(nullptr)
    {
 
    }
 
    void Add(T value)
    {
        if (root)
        {
            Add(value, root);
        }
        else
            root = new Item(value, nullptr);
    }
 
    void Print()
    {
        if (!root)
        {
            cout << "Tree is empty" << endl;
        }
        else
            Print(root);
    }
 
    ~Tree(){
        if (root)Destroy(root);
    }
        };
Вот функция main
C++
1
2
3
4
5
6
int main(){
    Tree <int> BTree;
    BTree.Add(50);
    BTree.Print();
    _getch();
}
Но при компиляции выдает
Code
1
Ошибка    1   error C2039: Add: не является членом "Tree<int>::Item"
Я не пойму что не так. Помогите разобраться
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.01.2014, 12:28
Ответы с готовыми решениями:

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

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

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

7
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.01.2014, 12:46
Цитата Сообщение от arking Посмотреть сообщение
Add(value, ptr->Add);
Add – это не свойство, а функция.
Может ты хотел написать вот так?
C++
1
Add(value, ptr);
1
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 17
25.01.2014, 12:57  [ТС]
при таком изменении ругается на
C++
1
Item(T value, Item* parent, Item* left = nullptr, Item* right = nullptr) { value(value), parent(parent), left(left), right(right) }
Ошибка 1 error C2064: результатом вычисления фрагмента не является функция, принимающая 1 аргументов
Ошибка 2 error C2143: синтаксическая ошибка: отсутствие ";" перед "}"

Дело в том, что этот класс был списан с доски, то есть должен быть верным. я думал что я что-то неправильно сделал в main, не так вызываю или объявляю
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.01.2014, 13:07
Я исправил класс Item: исправил конструктор и добавил переменную value. У меня всё работает.
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
#include <iostream>
using namespace std;
 
template <class T> class Tree
{
private:
    class Item{
        friend Tree;
        Item* parent;
        Item* left;
        Item* right;
        T value;
        Item(T value, Item* parent, Item* left = nullptr, Item* right = nullptr) : value(value), parent(parent), left(left), right(right) {}
    };
 
    Item* root;
 
    void Add(T& value, Item* ptr)
    {
        if (ptr->value > value)
        {
            if (ptr->left)
            {
                Add(value, ptr);
            }
            else
            {
                ptr->left = new Item(value, ptr);
            }
        }
        else
        {
            if (ptr->right)
            {
                Add(value, ptr->right);
            }
            else
            {
                ptr->right = new Item(value, ptr);
            }
        }
    }
    void Print(Item* ptr)
    {
        
        if (ptr->left)Print(ptr->left);
        cout << ptr->value << "; ";
        if (ptr->right)Print(ptr->right);
    }
 
    void Destroy(Item* ptr)
    {
        if (ptr->left)Destroy(ptr->left);
        if (ptr->right)Destroy(ptr->right);
        delete ptr;
    }
 
public:
    Tree() :root(nullptr)
    {
 
    }
 
    void Add(T value)
    {
        if (root)
        {
            Add(value, root);
        }
        else
            root = new Item(value, nullptr);
    }
 
    void Print()
    {
        if (!root)
        {
            cout << "Tree is empty" << endl;
        }
        else
            Print(root);
    }
 
    ~Tree(){
        if (root)Destroy(root);
    }
        };
int main(){
    Tree <int> BTree;
    BTree.Add(50);
    BTree.Print();
    system("pause");
}
1
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 17
25.01.2014, 13:40  [ТС]
Спасибо большое, выручили))

Добавлено через 27 минут
Можете еще помочь, почему при заполнении дерева случайными числами с помощью rand() происходит переполнение стека?
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.01.2014, 13:46
Цитата Сообщение от arking Посмотреть сообщение
с помощью rand()
Дай код, посмотрю.
0
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 17
25.01.2014, 13:49  [ТС]
Вот
C++
1
2
3
4
5
srand((unsigned)time(NULL));
    for (int i = 0; i < 10; i++)
    {
            BTree.Add(rand() % 100);
    }
0
 Аватар для SaweR
29 / 29 / 4
Регистрация: 29.09.2009
Сообщений: 177
25.01.2014, 14:29
Исправил:
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
#include <iostream>
#include <random>
using namespace std;
 
template <class T> class Tree
{
private:
    class Item
    {
        friend Tree;
        Item* parent;
        Item* left;
        Item* right;
        T value;
        Item(T value, Item* parent, Item* left = nullptr, Item* right = nullptr) : value(value), parent(parent), left(left), right(right) {}
    };
 
    Item* root;
 
    void Add(T& value, Item* ptr)
    {
        if (ptr->value > value)
        {
            if (ptr->left)
            {
                Add(value, ptr->left); // fix
            }
            else
            {
                ptr->left = new Item(value, ptr);
            }
        }
        else
        {
            if (ptr->right)
            {
                Add(value, ptr->right);
            }
            else
            {
                ptr->right = new Item(value, ptr);
            }
        }
    }
    void Print(Item* ptr)
    {
        
        if (ptr->left)Print(ptr->left);
        cout << ptr->value << "; " << endl;
        if (ptr->right)Print(ptr->right);
    }
 
    void Destroy(Item* ptr)
    {
        if (ptr->left)Destroy(ptr->left);
        if (ptr->right)Destroy(ptr->right);
        delete ptr;
    }
 
public:
    Tree() :root(nullptr)
    {
 
    }
 
    void Add(T value)
    {
        if (root)
        {
            Add(value, root);
        }
        else
            root = new Item(value, nullptr);
    }
 
    void Print()
    {
        if (!root)
        {
            cout << "Tree is empty" << endl;
        }
        else
            Print(root);
    }
 
    ~Tree(){
        if (root)Destroy(root);
    }
        };
int main()
{
    Tree <int> BTree;
    random_device rd;
    mt19937_64 gen(rd());
    uniform_int_distribution<int> dis;
    for (int i = 0; i < 10; i++)
    {
            BTree.Add(dis(gen));
    }
    BTree.Print();
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2014, 14:29
Помогаю со студенческими работами здесь

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

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

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

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

Зачем нужно бинарное дерево?
Какие задачи можно решать с помощью бинарного дерева?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru