Witam! Zajmuję się obecnie drzewami. Wg Niklausa Wirtha program do budowania drzewa wygląda następująco:
program Project2;
{$APPTYPE CONSOLE}
uses windows;
type
wskaznikowy= ^wezel;
wezel= record
klucz:integer;
lewe,prawe:wskaznikowy; {Tego nie wyświetlimy na ekranie}
end;
var
n:integer;
korzen:wskaznikowy;
FUNCTION drzewo (n:integer):wskaznikowy;
var
NowyWezel:wskaznikowy;
x,np,nl:integer;
begin
if n=0 then drzewo:=nil
else
BEGIN
nl:=n div 2; np:=n-nl-1;
writeln ('podaj kolejny element');
readln(x); new(NowyWezel);
with NowyWezel^ do
begin klucz:=x; lewe:=drzewo(nl); prawe:=drzewo(np); end;
drzewo:=NowyWezel;
END
end;{---drzewo-----------------------------}
PROCEDURE drukujdrzewo(t:wskaznikowy; h:integer);
var i:integer;
BEGIN
if t<>nil then
with t^ do
begin
drukujdrzewo(lewe,h+1);
for i:=1 to h do write(' ');
writeln(klucz);
drukujdrzewo(prawe,h+1);
end;
END;{------drukujdrzewo------------------}
begin
writeln ('podaj liczbe elementow');
readln(n);
korzen:=drzewo(n);
writeln;
drukujdrzewo(korzen,0);
readln ;
end.
Kod zaczerpnięty z książki "Algorytmy + struktury danych = programy" rok wydania 1989, strona 209-211. W tej samej książce podany jest program iteracyjny, w którym nie działa procedura budowania drzewa. Poniżej przedstawiam kod:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
ref= ^wezel;
wezel= record
klucz:integer;
lewe,prawe:ref;
end;
var
i,n,nl,np,x:integer;
korzen,p,q,r,fik:ref;
s:array[1..30] of
record n:integer; rf:ref;
end;
PROCEDURE drukujdrzewo(t:ref; h:integer);
var i:integer;
BEGIN
if t<>nil then
with t^ do
begin
drukujdrzewo(lewe,h+1);
for i:=1 to h do
writeln(klucz);
drukujdrzewo(prawe,h+1);
end;
END;{------drukujdrzewo--------}
BEGIN
writeln('podaj ile wezlow');readln(n); new(fik);
i:=1; s[1].n:=n; s[1].rf:=korzen;
repeat
n:=s[i].n; p:=s[i].rf; i:=i-1;
if n=0 then p^.prawe:=nil else
begin p:=fik;
repeat nl:=n div 2; np:=n-nl-1;
writeln('podaj liczbe'); readln(x); new(q);q^.klucz:=x;
i:=i+1; s[i].n:=np; s[i].rf:=q;
n:=nl; p^.lewe:=q; p:=q;
until n=0;
q^.lewe:=nil; p^.prawe:=fik^.lewe;
end
until i=0 ;
drukujdrzewo(korzen^.prawe,0);
readln;
END.
Dlaczego program iteracyjny nie działa?