Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
arking
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 17
25.01.2014, 12:28     Нужно реализовать класс Бинарное дерево. #1
Нужно реализовать класс Бинарное дерево.
Вот класс
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();
}
Но при компиляции выдает
Код
Ошибка	1	error C2039: Add: не является членом "Tree<int>::Item"
Я не пойму что не так. Помогите разобраться
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 12:28     Нужно реализовать класс Бинарное дерево.
Посмотрите здесь:

C++ Бинарное дерево
Класс бинарное дерево C++
бинарное дерево C++
Описать класс, реализующий бинарное дерево C++
Описать класс, реализующий бинарное дерево C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SaweR
 Аватар для SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
25.01.2014, 12:46     Нужно реализовать класс Бинарное дерево. #2
Цитата Сообщение от arking Посмотреть сообщение
Add(value, ptr->Add);
Add – это не свойство, а функция.
Может ты хотел написать вот так?
C++
1
Add(value, ptr);
arking
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 17
25.01.2014, 12:57  [ТС]     Нужно реализовать класс Бинарное дерево. #3
при таком изменении ругается на
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, не так вызываю или объявляю
SaweR
 Аватар для SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
25.01.2014, 13:07     Нужно реализовать класс Бинарное дерево. #4
Я исправил класс 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");
}
arking
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 17
25.01.2014, 13:40  [ТС]     Нужно реализовать класс Бинарное дерево. #5
Спасибо большое, выручили))

Добавлено через 27 минут
Можете еще помочь, почему при заполнении дерева случайными числами с помощью rand() происходит переполнение стека?
SaweR
 Аватар для SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
25.01.2014, 13:46     Нужно реализовать класс Бинарное дерево. #6
Цитата Сообщение от arking Посмотреть сообщение
с помощью rand()
Дай код, посмотрю.
arking
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 17
25.01.2014, 13:49  [ТС]     Нужно реализовать класс Бинарное дерево. #7
Вот
C++
1
2
3
4
5
srand((unsigned)time(NULL));
    for (int i = 0; i < 10; i++)
    {
            BTree.Add(rand() % 100);
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 14:29     Нужно реализовать класс Бинарное дерево.
Еще ссылки по теме:

C++ бинарное дерево
C++ Реализовать бинарное дерево, каждому ребру которого соответствует целое число
Нужно написать бинарное дерево и выполнить ряд заданий C++

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

Или воспользуйтесь поиском по форуму:
SaweR
 Аватар для SaweR
29 / 29 / 1
Регистрация: 29.09.2009
Сообщений: 177
25.01.2014, 14:29     Нужно реализовать класс Бинарное дерево. #8
Исправил:
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");
}
Yandex
Объявления
25.01.2014, 14:29     Нужно реализовать класс Бинарное дерево.
Ответ Создать тему
Опции темы

Текущее время: 03:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru