program Binarni_strom_trideni;

uses crt;

type UVrchol = ^Vrchol;
     Vrchol = record
                hodnota:integer;
                levy,pravy:UVrchol
              end;

var koren : UVrchol;

procedure Inorder(koren :UVrchol);
begin
  if (koren <> nil) then
  begin
    Inorder(koren^.levy);
    write(koren^.hodnota:6);
    Inorder(koren^.pravy);
  end;
end;

procedure Pridej_na_konec(c :integer; var rodic :UVrchol);
begin
  new(rodic);
  with rodic^ do
  begin
    hodnota:=c;
    levy:=nil;
    pravy:=nil
  end;
end;

procedure Pridej(c :integer; var rodic :UVrchol);
begin
  if (rodic = nil) then Pridej_na_konec(c, rodic)
  else if not(c = rodic^.hodnota) then
  begin
    if c < rodic^.hodnota then Pridej(c, rodic^.levy)
    else Pridej(c, rodic^.pravy)
  end;
end;

procedure Vytvor_Strom(var koren :UVrchol);
var rodic : UVrchol;
        c : integer;
begin
  gotoxy(16,12);write('Vkladej cisla (konec = 999): ');
  readln(c);
  if (c <> 999) then Pridej_na_konec(c, koren);
  while (c <> 999) do begin
    gotoxy(16,12); write('                                            ');
    gotoxy(16,12); write('Vkladej cisla (konec = 999): ');
    readln(c);
    if (c <> 999) then
    begin
      rodic := koren;
      Pridej(c, rodic)
    end;
  end;
end;

BEGIN
  clrscr;
  gotoxy(15,6); writeln('Program na demonstraci trideni a ruseni duplicit');
  gotoxy(23,8); writeln('Vytvoril David Padrta  -  IVT 3');
  Vytvor_Strom(koren);
  gotoxy(16,12); write('                                            ');
  gotoxy(16,12); writeln('Vzestupne setrideny soubor cisel:');
  writeln;
  Inorder(koren);
  writeln;
  writeln('Stiskni ENTER ...');
  readln;
  writeln('Program byl ukoncen.');
END.