program Binarni_strom_vyhledavani;

uses crt;

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

var koren : UVrchol;
    hod : integer;

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

procedure Hledej(koren :UVrchol);
var nalezeno : boolean;
begin
  nalezeno := false;
  if (koren <> nil) then
  begin
    if koren^.hodnota = hod then
    begin
      nalezeno := true;
      write('Hodnota byla nalezena');
    end;
    if koren^.hodnota > hod then Hledej(koren^.levy);
    if koren^.hodnota < hod then Hledej(koren^.pravy);
  end
  else if nalezeno = false then writeln('Hodnota nebyla nalezena.');
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(10,6); writeln('Program na demonstraci vyhledavani pomoci binarniho stromu');
  gotoxy(23,8); writeln('Vytvoril David Padrta  -  IVT 3');
  gotoxy(18,10); writeln('Ze stromu budou vyrazena duplicitni cisla.');
  Vytvor_Strom(koren);
  writeln;
  write('Vloz hodnotu, kterou chces najit : ');
  readln(hod);
  Hledej(koren);
  writeln;
  writeln('Vzestupne setrideny soubor cisel : ');
  Inorder(koren);
  writeln;
  writeln('Stiskni ENTER ...');
  readln;
  writeln('Program byl ukoncen.');
END.