25 / 25 / 17
Регистрация: 23.09.2012
Сообщений: 274
1

Разработать программу работы с бинарным деревом. Программа должна содержать следующие процедуры, вызываемые из меню

15.01.2013, 23:02. Показов 1772. Ответов 1
Метки нет (Все метки)

Разработать программу работы с бинарным деревом. Программа должна содержать следующие процедуры, вызываемые из меню:
- построение пустого дерева;
- добавление нового элемента;
- удаление указанного элемента;
- просмотр дерева в следующем порядке: левая ветвь, правая ветвь, узел.
Код, но не корректно работающий:
Pascal
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
program L14_02;
uses
 crt;
type
 link  = ^element;
 element = record
           data: integer;
           left: link;
           right: link;
          end;
var
 m,x, depth, minim : integer;
 pn : link;
 
{dobavlenie}
procedure add(var n : link; arg:integer);
var
 ind, neo: link;
begin
 new(neo);
 neo^.data:=arg;
 neo^.left:=nil;
 neo^.right:=nil;
 if n=nil then
  n:= neo
 else
 begin
  ind:=n;
  while neo<>nil do
  begin
   if arg<ind^.data then
   begin
    if ind^.left=nil then
    begin
     ind^.left:=neo;
     neo:=nil
    end
    else
     ind:=ind^.left
   end
   else
    if arg>ind^.data then
    begin
     if ind^.right=nil then
     begin
      ind^.right:=neo;
      neo:=nil
     end
     else
      ind:=ind^.right
    end
    else
    begin
     writeln('Takoy element uzhesushestvuet!');
     neo:=nil;
    end;
  end;
 end;
end;
 
procedure restruct(var d : link);
var
 ind1, ind2: link;
begin
 ind1:=d;
 if ind1^.right=nil then
 begin
  ind2:=d;
  d:=ind2^.left;
  dispose(ind2)
 end
 else
  if ind1^.left=nil then
  begin
   ind2:=d;
   d:=ind2^.right;
   dispose(ind2)
  end
  else
  begin
   ind2:=ind1^.left;
   while ind2^.right<>nil do
   begin
    ind1:=ind2;
    ind2:=ind2^.right;
   end;
   ind1^.right:=ind2^.left;
   ind2^.left:=d^.left;
   ind2^.right:=d^.right;
   dispose(d);
   d:=ind2;
  end;
end;
 
procedure delete(var n : link; arg:integer);
var
 del, ind : link;
 t: boolean;
begin
 t:=false;
 del:=n;
 while (del<>nil) and (not t) do
 begin
  if arg=del^.data then
   t:=true
  else
   if arg<del^.data then
   begin
    ind:=del;
    del:=del^.left;
   end
   else
   begin
    ind:=del;
    del:=del^.right;
   end;
 end;
 if t then
 begin
  if (del^.left=nil) and (del^.right=nil) then
  begin
   if del=n then
   begin
    n:=nil;
    dispose(del)
   end
   else
    if ind^.left=del then
    begin
     ind^.left:=nil;
     dispose(del)
    end
    else
    begin
     ind^.right:=nil;
     dispose(del)
    end
   end
   else
    if del=n then
     restruct(n)
    else
     if ind^.left=del then
      restruct(ind^.left)
     else
      restruct(ind^.right)
  end
  else
   writeln('Element otsutstvuet');
end;
 
procedure view(n : link; var d:integer);
var
 i : integer;
begin
 for i:=1 to d do
  write('    ');
 writeln(n^.data);
 if (n^.left=nil) and (n^.right=nil) then
  d:=d-1
 else
 begin
  if n^.right<>nil then
  begin
   d:=d+1;
   view(n^.right,d);
  end;
  if n^.left<>nil then
  begin
   d:=d+1;
   view(n^.left, d);
  end;
  d:=d-1;
 end;
end;
 
procedure obhod1(    n : link; var d, min:integer);
begin
 if (n^.left=nil) and (n^.right=nil) then
 begin
  if d<min then
   min:=d;
  d:=d-1
 end
 else
 begin
  if n^.right<>nil then
  begin
   d:=d+1;
   obhod1(n^.right, d, min);
  end;
  if n^.left<>nil then
  begin
   d:=d+1;
   obhod1(n^.left, d,min)
  end;
  d:=d-1;
 end;
end;
 
procedure obhod2(    n : link; var d:integer; min:integer);
begin
 if (n^.left=nil) and (n^.right=nil) then
 begin
  if d=min then
   writeln(n^.data);
  d:=d-1;
 end
 else
 begin
  if n^.right<>nil then
  begin
   d:=d+1;
   obhod2(n^.right,d,min);
  end;
  if n^.left<>nil then
  begin
   d:=d+1;
   obhod2(n^.left, d,min);
  end;
  d:=d-1;
 end;
end;
 
{osn programma}
begin
 m:=1;
 pn:=nil;
 while m<>0 do
 begin
  writeln;
  writeln('--- Nazhatj "1" DOBAVITJ element');
  writeln('--- Nazhatj "2" UDALITJ element');
  writeln('--- Nazhatj "3" PROSMOTR dereva');
  writeln('--- Nazhatj "0" to EXIT program');
  writeln;
  write('Vvedite: ');
  readln(m);
  writeln;
  case m of
   1 : begin
        write('Vvedite novyi element: ');
        readln(x);
        add(pn, x);
       end;
   2 : begin
        write('Vvedite element dlya udaleniya: ');
        readln(x);
        delete(pn, x);
       end;
   3 : begin
        depth:=1;
        if pn=nil then
         writeln('Derevo pustoe')
        else
        begin
         writeln('Derevo: ');
         view(pn, depth);
        end;
       end;
  end;
 end;
 readkey;
end.
Подскажите, в чем ошибка.
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2013, 23:02
Ответы с готовыми решениями:

Разработать программу работы с бинарным деревом
Разработать программу работы с бинарным деревом. Программа должна содержать следующие процедуры,...

Разработать программу работы с бинарным деревом
Народ, прошу помощи в решении нескольких заданий, в противном случае, не видать мне сессии.......

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

Написать программу для работы с типизированным файлом. Программа должна выполнять следующие функции
Написать программу для работы с типизированным файлом. Программа должна выполнять следующие...

1
314 / 273 / 272
Регистрация: 25.09.2011
Сообщений: 477
16.01.2013, 16:23 2
Судя по тексту программы, нужно поисковое дерево.
Воспользовавшись уже существующей информацией на форуме
Динамические структуры данных (списки, очереди, стеки, деревья)
использовал код lexus_ilia дописал процедуру
Удаление элемента из структуры дерева
добавил пункт в меню.

Pascal
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
155
156
157
158
159
160
161
162
163
uses crt;
type
PNode=^Node;  {Указатель на узел}
 Node=record  {Тип запись в котором будет храниться информация}
   data      : integer;
   left,right: PNode; {Ссылки на левого и правого сыновей}
end;
 
var
  Tree,p1: PNode; {Tree адрес корня дерева, p1-вспомогательная переменная}
  Ovn    : PNode; { Владелец найденного элемента после поиска }
  n,x,i:integer;
  ch:char; {для работы менюшки}
 
{Процедура добавления элемента }
procedure AddToTree (var Tree: PNode;x:integer); {Входные параметры - адрес корня дерева и добавл элемент }
begin
 if Tree=nil then  {Если дерево пустое то создаём его корень}
   begin
     New(Tree);   {Выделяем память }
     Tree^.data:=x;     {Добавляем данные }
     Tree^.left:=nil;     {Зануляем указатели на левого }
     Tree^.right:=nil;  {и правого сыновей }
      exit;
   end;
 if x < Tree^.data then   {Доб к левому или правому поддереву это завсит от вводимого элемента}
     AddToTree(Tree^.left,x)  {если меньше корня то в левое поддерево }
  else
    AddToTree(Tree^.right,x);  {если больше то в правое}
end;
 
{Функция поиска по дереву}
function Search(Tree: PNode;x:integer): PNode; {Возвращает адрес искомого элемента, nil если не найден}
var
p: PNode;   {вспомог переменнная }
begin
  if Tree=nil then   {если дерево пустое то}
     begin
       Search:=nil;  {присваеваем функции результат нил}
       exit; {и выходим }
     end;
  if x=Tree^.data then  {если искомый элемент равен корню дерева то }
    p:=Tree  {Пзапоминаем его адрес }
     else begin  {иначе}
       Ovn:=Tree; {сохраняем в глоб. перем адрес отца сыновей}
       if x < Tree^.data then {если вводимый элемент менньше корня то }
          p:=Search(Tree^.left,x) {то ищем его в левом поддереве}
                         else     {иначе }
          p:=Search(Tree^.right,x);  {ищем в правом поддереве }
     end;
  Search:=p; {присваеваем переменной с именем фугкции результат работы}
end;
 
{Обход дерева по принципу Левый-корень-правый }
procedure Lkp(Tree: PNode);
begin
  if Tree=nil then  {Если дерево пустое }
   exit;      {то выход }
  Lkp(Tree^.left);  {иначе начинаем обход с левого подднрева}
  write('  ',Tree^.data); {выводим данные }
  Lkp(Tree^.right);  {обходим правое поддерево}
end;
 
{ Вставить уже существующее дерево/элемент в структуру дерева }
procedure InsertNode(var Tree : PNode; Ins : PNode);
begin
 if Tree=nil then  {Если дерево пустое то вставляемый будет корнем }
   begin
     Tree:=Ins; exit;
   end;
 if Ins^.Data < Tree^.data then   {Доб к левому или правому поддереву это завсит от вводимого элемента}
     InsertNode(Tree^.left,Ins)  {если меньше корня то в левое поддерево }
  else
     InsertNode(Tree^.right,Ins);  {если больше то в правое}
end;
 
{Удаление елемента в дереве. true, если елемент был удален}
function DeleteNode(var Tree: PNode; x:integer):boolean;
var ToIns,ToDel: PNode;
begin
  Ovn:=nil; { глоб. перем для определения владельца удаляемого }
  ToDel:=Search(Tree,x); DeleteNode:=true;
  if ToDel = nil then begin DeleteNode:=false; exit; end;
  if ToDel=Tree then begin { найденный элемент является корнем }
    if ToDel^.left<>nil then begin
      Tree:=ToDel^.left;   { корнем становится левый сучок }
      ToIns:=ToDel^.right; { а правый потом вставим }
    end else begin        {если и правый окажется nil, то все дерево пустое}
      Tree:=ToDel^.right;  { корнем становится правый }
      ToIns:=ToDel^.left;  { левый вставим позже }
    end;
  end else begin
    if Ovn^.right=ToDel then begin {если найденный под удаление правый, то}
      Ovn^.right:=ToDel^.right; {правый сын предка теперь его внук }
      ToIns:=ToDel^.left;         {оставшийся сучок, который нужно вставить}
    end else begin
      Ovn^.left:=ToDel^.left;   { иначе левый внук становится сыном}
      ToIns:=ToDel^.right;      { оставшийся не у дел }
    end;
  end;
  Dispose(ToDel); { Удаление найденного элемента }
  InsertNode(Tree,ToIns); { Вставляем оставшийся сучок в структуру дерева }
end;
 
{Процедура удаления дерева}
procedure DeleteTree(var Tree1: PNode );
begin
        if Tree1 <> nil then
          begin
            DeleteTree (Tree1^.LEFT);
            DeleteTree (Tree1^.RIGHT);
            Dispose(Tree1);
          end;
end;
 {основная пограмма}
Begin
 Tree:=nil; Ovn:=nil;
 repeat {цикл для нашего меню}
 
    Writeln('Выберете действие ');
    Textcolor(2);
    Writeln('Доступны следующие пункты:');
    Writeln('1) Создание дерева поиска');
    if Tree<>nil then Writeln('2) Поиск элемента в дереве');
    Writeln('3) Вывод дерева');
    if Tree<>nil then WriteLn('4) Удаление элемента');
    Writeln('5) ВВыход');
    writeln;
    readln(ch); {ожидаем нажатия клавиши}
    case ch of {выбираем клавишу}
      '1': begin
            writeln(' kolv elementov');
            readln(n);
              for i:=1 to n do
                begin
                  writeln('Введите число');
                  readln(x);
                  AddToTree(Tree,x);
                end;
           end;
       '2': begin
               writeln('Ёлемент для поиска');
               readln(x);
               p1:=Search(Tree,x);
                  if p1 <> nil then
                    writeln('Найден')
                  else writeln('Такого элемента нет!');
            end;
        '3': begin
              writeln('Само дерево');
              Lkp(Tree);
              writeln;
             end;
       '4': begin
               writeln('Элемент для удаления');
               readln(x);
               if DeleteNode(Tree,x) then writeln('Удален')
                                     else writeln('Такого элемента нет!');
            end;
        end;
   until ch='5';
   DeleteTree(Tree);
End.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2013, 16:23
Помогаю со студенческими работами здесь

Класс строка. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса
Здравствуйте народ, есть такая задача. Определить класс &quot;строка&quot;. в классе предусмотреть следующие...

Библиотеки. Построить класс для работы с бинарным деревом
Построить класс для работы с бинарным деревом, узлы которого содержат действительные числа. Создать...

Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:
12. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для...

Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры или функции) для работы со строками:
Помогите пожалуйста. Разработать библиотечный модуль, содержащий следующие подпрограммы (процедуры...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru