Пишу вот лабу про деревья.
Суть её такова: построить дерево и реализовать прямой его обход (там ещё обратный и симметричный, но пока хоть бы прямой). Но не простой обход, а полный: показать, какие вершины последовательно анализируются.
Т.е., если в дерево вогнать последовательно 8,6,4,1,2,3,15,11,13,9,5 - он вывел
8-6-4-1-0-1-2-0-2-3-0-3-0-3-2-1-4-5-0-5... (0 - значит, пустой лист найден)
Суть проблемы: когда надо возвращаться, моя программа не отображает этого. Т.е, при этом дереве она пропускает символы:
8-6-4-1-0-1-2-0-2-3-0-3-0-4-5-0-5... (нету этого возврата 3-2-1)
Помогите, пожалуйста!
program tree;
uses crt;
Type tekst = integer;
adrzv = ^zveno;
zveno = record
kl:integer;
inf:tekst;
lev,prav:adrzv;
end;
var
t:adrzv;
n,c,f,i,y,otvet:integer;
mn: set of 1..100;
Procedure add(var S: adrzv; k: integer); {добавление элементов}
Begin
If s = nil
then
Begin
New(s);
s^.kl:=k;
s^.lev:=nil;
s^.prav:=nil;
End
else
If k < s^.kl then add(s^.lev, k);
If k > s^.kl then add(s^.prav, k);
End;
Procedure show(var s:adrzv; h: integer); {вывод дерева}
Var i: integer;
Begin
If s <> nil then
Begin
show(s^.prav, h + 4);
For i:=1 to h do write(' ');
Writeln(s^.kl);
show(s^.lev, h + 4);
End
End;
Procedure direct(var s:adrzv); {процедура обхода}
Var i: integer;
Begin
if s= nil then write('0 ')
else
begin
if s^.kl in mn then write(s^.kl,' ')
else begin mn:=mn+[s^.kl]; write(s^.kl,'+ '); end;
direct(s^.lev);
if s^.kl in mn then write(s^.kl,' ')
else begin mn:=mn+[s^.kl]; write(s^.kl,'+ '); end;
direct(s^.prav);
end;
End;
begin clrscr;
writeln('random or not?(1/2)');
read(otvet);
case otvet of
1: begin
randomize;
for i:=1 to 10 do add(t,random(20));
end;
2: begin
writeln('enter number of elements');
readln(n);
writeln('enter elements');
for i:=1 to n do
begin
read©;
add(t,c);
end;
end;
end;
show(t,c);
direct(t);
readkey;
end.