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

Построение бинарного дерева. Где ошибка? - C++

Восстановить пароль Регистрация
 
vab9petryk
 Аватар для vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 212
24.05.2014, 23:36     Построение бинарного дерева. Где ошибка? #1
Насколько понял, tree->left, tree->right указывает на NULL. Почему, не могу разобратся.
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
#include <iostream>
#include <ctime>
using namespace std;
struct node {
       char letter;
       node *left, *right;
}*tree = NULL;
 
node *add_tree (int n){
     node *ptr, *root = new node;
     root->left = root->right = NULL;
     cout<<"Vvedite ";
     cin>>root->letter;
     srand (time(NULL));
     while (n > 0){
           ptr = root;
           while (ptr){
                 if (rand()%10<5) ptr = ptr->left;
                 else ptr = ptr->right;
                 }
           ptr = new node;
           ptr->left = ptr->right = NULL;
           cout<<"Vvedite znach ";
           cin>>ptr->letter;
           n--;
           }
     return root;
     }
     
void vyvod(node *ptr, int l){
  int i;
  if (ptr) {
    vyvod(ptr->right, l+1);
    for (i=0; i< l; i++) cout << "    ";
    cout<<ptr->letter;
    vyvod(ptr->left, l+1);
  }
  else cout << endl;
}
 
int main(){
    tree = add_tree (4);
    vyvod (tree, 1);
    system("pause");
    return 0;
    }
Добавлено через 10 часов 20 минут
upd
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
24.05.2014, 23:56     Построение бинарного дерева. Где ошибка? #2
vab9petryk, а где конкретно вылетает? На каком этапе?
vab9petryk
 Аватар для vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 212
25.05.2014, 01:05  [ТС]     Построение бинарного дерева. Где ошибка? #3
Хедин, да оно не вылетает, оно все работает. Но вот когда пытаюсь вывести значения дерева через функцию vyvod, то выводится только корень дерева. Отсюда и понял, что корень->лефт и корень->райгт указывают на НУЛЛ. Почему, не могу понять. Ведь в функции построения дерева вроде бы выделяю для них память
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 408
25.05.2014, 06:08     Построение бинарного дерева. Где ошибка? #4
C++
1
2
3
4
5
6
while (ptr){
  if (rand()%10<5) ptr = ptr->left;
     else ptr = ptr->right;
   }
   ptr = new node; // потому, что здесь адрес ты присваиваешь не правому\левому указателю, а локальной переменной, которая при выходе из цикла уничтожится.
  ptr->left = ptr->right = NULL;
Сама по себе структура дерева немного странная.
vab9petryk
 Аватар для vab9petryk
2 / 2 / 0
Регистрация: 28.09.2013
Сообщений: 212
25.05.2014, 13:03  [ТС]     Построение бинарного дерева. Где ошибка? #5
Вованя, а, догнал, я присваиваю переменной, по сути, то, на что указывает ptr->right, ptr->left, а они указывают на NULL. После этого я выделяю память для этой переменной, но не для кореня. Только вот как бы это исправить.
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 408
25.05.2014, 14:06     Построение бинарного дерева. Где ошибка? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от vab9petryk Посмотреть сообщение
Только вот как бы это исправить.
Попробуй так
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
while (n > 0)
{
    ptr = root;
    while (ptr)
    {
        if (rand()%10<5) 
        {
            if(ptr->left)
                ptr = ptr->left;
            else 
            {
                ptr->left = new node;
                ptr->left->left = ptr->left->right = 0;
                cout << "Vvedite znach ";
                cin >> ptr->left->letter;
                                break;
            }
        }
        else
        {
            if(ptr->right)
                ptr = ptr->right;
            else 
            {
                ptr->right = new node;
                ptr->right->left = ptr->right->right = 0;
                cout << "Vvedite znach ";
                cin << ptr->right->letter;
                                break;
            }
        }
    }
    n--;
}
Yandex
Объявления
25.05.2014, 14:06     Построение бинарного дерева. Где ошибка?
Ответ Создать тему
Опции темы

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