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

Бинарное дерево - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
11.03.2012, 21:06     Бинарное дерево #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
struct node{
       int data; //поле данных
       node* left; //указатель на левый потомок
       node* right; //указатель на правый потомок
};
 
 
class tree {
public:
    node* root;
 
 
    tree() {
        root = NULL;
    }
 
    node *create(int info) {
        node *new_node = new node;
        new_node->data = info;
        new_node->left = NULL;
        new_node->right = NULL;
        return new_node;
    }
    node *funny_boy(node* root, int info) {
        if(root == NULL) root = create(info);
        if(info < root->data)
            if(root->left = NULL)
                root->left = create(info);
            else
                funny_boy(root->left, info);
        if(info >= root->data)
            if(root->right == NULL)
                root->right = create(info);
            else 
                funny_boy(root->right, info);
        return root;
    }
    void printt(node *root) {
        if(root != NULL) {
            printt(root->left);
            printf("%d 5", root->data);
            printt(root->right);
        }
    }
};
мэйн
C++
1
2
3
4
5
6
7
8
9
10
11
int main() {
    setlocale(LC_ALL, "");
    tree t;
 
    t.funny_boy(t.root, 5);
        t.funny_boy(t.root, 10);
    t.printt(ROOT);
 
    printf("%d", t.root->data);
 
    t.printt(t.root);
Должен вывести 5, 10 или не знаЮ, мусор там. На крайняк выдать ошибку.
Ошибок не выводит, выводит пустой экран.

Что я делаю не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2012, 21:06     Бинарное дерево
Посмотрите здесь:

C++ Бинарное дерево
Бинарное дерево C++
C++ Бинарное дерево
бинарное дерево C++
Бинарное дерево C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
11.03.2012, 21:14     Бинарное дерево #2
может так
C++
1
2
3
4
5
if(root == NULL)
{
    root = create(info);
    return root;
}
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
11.03.2012, 22:41  [ТС]     Бинарное дерево #3
Нет, не помогло

Добавлено через 1 минуту
Да и все в порядке в тех строках

Добавлено через 33 минуты
Вообще есть где-то пример бинарного дерева на основе узла-структуры и класса-дерева?

Добавлено через 12 минут
функцию мэйн поправил
это тестил бред всякий

C++
1
2
3
4
5
6
7
8
9
int main() {
        setlocale(LC_ALL, "");
        tree t;
 
        t.funny_boy(t.root, 5);
        t.funny_boy(t.root, 10);
 
        t.printt(t.root);
}
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
11.03.2012, 22:47     Бинарное дерево #4
мб так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void funny_boy(node* root, int info) {
                if(root == NULL) {
                    root = create(info);
                    return;
                }
                if(info < root->data)
                        if(root->left = NULL)
                                root->left = create(info);
                        else
                                funny_boy(root->left, info);
                if(info >= root->data)
                        if(root->right == NULL)
                                root->right = create(info);
                        else 
                                funny_boy(root->right, info);
        }
Добавлено через 2 минуты
retmas, не заметил ваш пост, по идее там ошибка.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
11.03.2012, 22:50     Бинарное дерево #5
имея то, что имеем придется писать
C++
1
2
        t.root = t.funny_boy(t.root, 5);
        t.root = t.funny_boy(t.root, 10);
Цитата Сообщение от VladSharikov Посмотреть сообщение
Да и все в порядке в тех строках
без этого:
C++
1
2
3
4
5
if(root == NULL)
{
    root = create(info);
    return root;
}
вставит больше нодов, чем надо
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
11.03.2012, 23:33  [ТС]     Бинарное дерево #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 node *funny_boy(node* root, int info) {
                if(root == NULL) { root = create(info); return root; }
                if(info < root->data)
                        if(root->left = NULL)
                                root->left = create(info);
                        else
                                funny_boy(root->left, info);
                if(info >= root->data)
                        if(root->right == NULL)
                                root->right = create(info);
                        else 
                                funny_boy(root->right, info);
                return root;
        }
в итоге так должно выглядеть?

а вот щас чего то делал по методу "первокурсника", дак у меня просто в мейне
tree t;

он вылетает. я так понимаю вылетает при вызове конструктора(вернее точно при этом), а это что такое? О_О
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
11.03.2012, 23:35     Бинарное дерево #7
VladSharikov, зачем в ф-ции funny_boy что-либо возвращать? она же добавляет элемент, и только.
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
11.03.2012, 23:38  [ТС]     Бинарное дерево #8
Вы сказали возвращать, обратил внимание.

У вас функция void а в коде есть return(что не правильно)

Сейчас попробую.

Но мне кажеться, вы что то путаете. Гуглю уже 5ый битый час и все что встречал именно с типом (имя структуры) и return

Добавлено через 22 секунды
Да и сам я думаю там должен быть return и node * вместо воид
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
11.03.2012, 23:38     Бинарное дерево #9
Цитата Сообщение от VladSharikov Посмотреть сообщение
У вас функция void а в коде есть return(что не правильно)
уверены, что не правильно?
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
11.03.2012, 23:42  [ТС]     Бинарное дерево #10
Нет сто процентов надо возвращать указатель

Добавлено через 1 минуту
Функция void( в переводе пустой ), не возвращает никаких значений.

да и вот выдержка из хелпа

" the void keyword specifies that the function does not return a value"

Добавлено через 1 минуту
Мы сейчас спорим о том должен ли воид возвращать что-то или нужен ли воид в моей функции?

По поводу первого, возможно, я не столько с войдом работал, но в любом случае, вопрос в другом
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
11.03.2012, 23:43     Бинарное дерево #11
Она у меня и так ничего не возвращает, а return свидетельствует лишь о том в данном случае, что нужно выходить из функции.

Добавлено через 34 секунды
Ну я просто не понимаю, зачем функции, которая добавляет новый элемент в дерево, что-либо возвращать, объясните, зачем оно вам.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2012, 23:56     Бинарное дерево
Еще ссылки по теме:

C++ Дерево бинарное
Бинарное дерево. С++ C++
Бинарное дерево C++

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

Или воспользуйтесь поиском по форуму:
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
11.03.2012, 23:56  [ТС]     Бинарное дерево #12
Ибо это рекурсивная функция создания дерева. Как по другому сделать я не знаю. Скока учебники не листаю, не гуглю везде так!

Добавлено через 19 секунд
Есть еще итеррационная, но это другоке
Yandex
Объявления
11.03.2012, 23:56     Бинарное дерево
Ответ Создать тему
Опции темы

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