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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.63
-=Den=-
7 / 7 / 1
Регистрация: 03.04.2011
Сообщений: 175
#1

Бинарные деревья на С++ - C++

10.04.2011, 00:05. Просмотров 4676. Ответов 9
Метки нет (Все метки)

пишу программу в Dev-C++ для работы с бинарными деревьями.
возникла такая проблема: функция FindTree возвращает отрицательное значение, т.е. она считает, что дерево пустое и возвращает -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
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#include <iostream>
#include <iomanip>
#include <fstream>
#include <conio.h>
 
using namespace std;
 
ifstream in_file("input.txt");
ofstream out_file("output.txt");
 
int kol = 0;
char find_word[64];
 
struct tree
{
       string sl;
       tree *left;
       tree *right;
};
 
typedef tree* derevo;
 
void AddTree(derevo &t, string w)
{
     if (t == NULL)
     {
           t = new tree;
           t->left = NULL;
           t->right = NULL;
           t->sl = w;
     }
     else
     {
         if (w >= t->sl)
            AddTree(t->right, w);
         if (w < t->sl)
            AddTree(t->left, w);
     }
}
 
void OutTree(derevo t, int level=1)
{
     int tab = 5;
     if (t == NULL)
        out_file << "Пустое дерево\n";
     else
     {
         if (t->right != NULL)
            OutTree(t->right, level + 1);  
         out_file << setw(tab*level) << t->sl << endl;
         if (t->left != NULL)
            OutTree(t->left, level + 1);
     }
}
 
int FindTree(char find_word[64], derevo *t)
{
     if (*t == NULL)
         kol = -1;
     else
     {
         in_file >> find_word;
         if ((**t).sl == find_word)
            kol = 1;
         else
         {
            if (find_word < (**t).sl)
            {
                  FindTree(find_word, &((**t).left));
                  kol++;
            }
            else
            if (find_word > (**t).sl)
            {
                  FindTree(find_word, &((**t).right));
                  kol++;
            }
         }
     }
     return kol;    
}
 
void DeleteTree(derevo &t)
{
     if (t)
     {
           DeleteTree(t->left);
           DeleteTree(t->right);
           delete t;
           t = NULL;
     }
}
 
int main()
{
      setlocale(LC_ALL,"Russian");
      nazad:
      printf("Выберите действие: \n 1 - Выполнение программы \n 2 - Вывод количества шагов поиска элемента \n 0 - Выход \nНомер действия: ");
      cin >> arg;
      if (arg == 1 or arg == 2 or arg == 0)  
      {
      if (arg == 1)  
            {
                system("cls");
                derevo tl, t;
                int n;
                string e;
                t = NULL;
                while (in_file >> e)
                      AddTree(t, e);
                OutTree(t);
                system("pause");
                in_file.close();
                goto nazad;
                 
            }
      if (arg == 2)  
            {
                derevo t;
                int z = 0;
                system("cls");
                ifstream in_file("input.txt");
                while (!in_file.eof())
                {
                      in_file >> find_word;
                      FindTree(find_word, &t);  
                      z = z + FindTree(find_word, &t);
                }
                if (z == -1)
                   cout << "Пустое дерево\n";
                else        
                   cout << "\nКоличество сравнений: " << z << endl;
                cout << endl << endl;
                system("pause");
                system("cls");
                goto nazad;
            }            
      if (arg == 0)  
            {
                 derevo t;
                 DeleteTree(t);              
                 return 0;
            }
      }
      else  
      {
         printf("\n    !Неверный аргумент! \n");  
         cin.clear();
         _flushall();
         goto nazad;
      }
      system("PAUSE");
      return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2011, 00:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Бинарные деревья на С++ (C++):

Деревья (длина пути ...) - C++
Используя очередь или стэк написать функцию, которая находит в непустом дереве Т длину (число ветвей) пути от корня до ближайшей вершины Е;...

Бинарные файлы - C++ Builder
Список студентов в группе: номерпо журналу, ФИО, рейтинг по мате-матике, физике, информатике, сред-ний балл по предметам по 100-балльной...

Бинарные файлы - C++ Builder
Необходима небольшая задача начального курса универа. Тема: бинарные файлы. Расписание движения международных автобусов: пункт...

Деревья в Билдере - C++ Builder
Ребят, прошу помочь с логикой программы, вообщем по сути нужно нарисовать дерево, не важно какое и далее с ним работать. Раньше с графикой...

Двоичные деревья! - C++ Builder
Срочно нужно перейти на С++ (до этого прогил только на Делфи), нужен синтаксис реализации двоичного дерева на С++. Может кто-нибудь скинуть...

Деревья (баг) - C++ Builder
Пишу (хотя сильно сказано) на основе некогда надыбанного и переваренного кода. Там была сортировка, теперь просто делаю три вида обхода....

9
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
10.04.2011, 07:47 #2
117 и далее. Выполняешь поиск в не инициализированном дереве. Т.е. оно ничего не находит, т.к. ничего нет. Более того, объект t содержит мусор, т.к. ты его даже не обнулил. В релизе программа просто упадёт.
0
-=Den=-
7 / 7 / 1
Регистрация: 03.04.2011
Сообщений: 175
10.04.2011, 09:50  [ТС] #3
и как это исправить? я еще новичок в С++, многого не знаю
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
10.04.2011, 10:26 #4
Заполни дерево чем-нибудь, а потом уже ищи в нём. А то сейчас ищешь в пустом дереве и удивляешься, что ничего не находит.
Тут в подписи у кого-о есть жизненно важная цитата "RAII-...", суть которой в том, что инициализировать объект нужно сразу же после создания (или в момент создания). Если ты не можешь инициализирвовать объект сразу же, возможно, и создавать его нужно не сейчас.
В строке 119 ты создал указатель, не обнулив его. Ничего полезного в него тоже не записал. А в строке 126 используешь. В дебаге он у тебя обнулён, поэтому возвращает -1, но в релизе там будет мусор и программма будет падать.
0
-=Den=-
7 / 7 / 1
Регистрация: 03.04.2011
Сообщений: 175
11.04.2011, 15:09  [ТС] #5
дерево заполняется в 109-110 строках, а потом я его нигде обнуляю... так что оно должно быть заполнено
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.04.2011, 15:16 #6
Это если введёшь 1, а когда вводишь 2, то оно не заполнено.
0
-=Den=-
7 / 7 / 1
Регистрация: 03.04.2011
Сообщений: 175
11.04.2011, 22:21  [ТС] #7
дак она выдает отрицательные числа, даже если нажать один, а потом 2
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.04.2011, 06:28 #8
105 и 119 это РАЗНЫЕ деревья. Повторяю, ты используешь не инициализированное дерево.
И сделай цикл по человечески. Я только сейчас на goto обратил внимание.
0
-=Den=-
7 / 7 / 1
Регистрация: 03.04.2011
Сообщений: 175
12.04.2011, 13:30  [ТС] #9
все, спасибо, разобрался
0
serega478
0 / 0 / 0
Регистрация: 29.10.2012
Сообщений: 15
13.02.2014, 19:04 #10
Цитата Сообщение от -=Den=- Посмотреть сообщение
все, спасибо, разобрался
у тебя остался код этой проги? оч нужно
0
13.02.2014, 19:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2014, 19:04
Привет! Вот еще темы с ответами:

бинарные деревья - Visual C++
Помогите, плиз, с такой задачей!!!!! Реализовать методы в классе: 1. Создание бинарного дерева. Данные взять из файла. 2. Добавление...

Бинарные деревья - Visual C++
Люди!!! Помогите пожалуйста в Visual C++ решить задачу: дана информация о пяти печатных изданиях: название, вид(газета, журнал), тираж,...

Бинарные деревья - Prolog
Помогите, пожалуйста! Visual Prolog Даны число N, число M и список, элементы которого — непустые бинарные деревья с числами в качестве...

Бинарные деревья - Prolog
Определить наличие на каком-либо из путей от корня до листа хотя бы двух узлов с одинаковым именем. ?- pred(a(f(a(m,k),r),n)). yes ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru