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?