Program P132;
 { Arbori binari de căutare }
type Arbore=^Nod;
     Nod=record
               Cheie : integer;
                Info : string;
             Stg, Dr : Arbore
         end;
var T,         { rădăcina }
    P : Arbore;
   ch : integer;
  inf : string;
    c : Char;

procedure Cautare(T : Arbore; ch : integer; var P : Arbore);
begin
 if T=nil then P:=nil
    else if ch=T^.Cheie then P:=T
            else if ch<T^.cheie then Cautare(T^.Stg, ch, P)
                                else Cautare(T^.Dr, ch, P);
end; { Cautare }

procedure Inserare(var T : Arbore; ch : integer; inf : string);
var Q : Arbore;
begin
 if T=nil then begin
                 new(Q);
                 Q^.Cheie:=ch;
                 Q^.Info:=inf;
                 Q^.Stg:=nil;
                 Q^.Dr:=nil;
                 T:=Q;
               end
    else if ch=T^.Cheie then writeln('Nodul există deja')
            else if ch<T^.Cheie then Inserare(T^.Stg, ch, inf)
                                else Inserare(T^.Dr, ch, inf);
end; { Inserare }

procedure AfisArb(T : Arbore; nivel : integer);
 { afişarea arborelui binar }
var i : integer;
begin
 if T<>nil then
    begin
     AfisArb(T^.Stg, nivel+1);
     for i:=1 to nivel do write('    '); writeln(T^.Cheie, '_', T^.Info);
     AfisArb(T^.Dr, nivel+1);
    end;
end; { AfisareArb }

procedure Inordine(T : Arbore);
 { traversare SRD }
begin
 if T<>nil then begin
                  Inordine(T^.Stg);
                  writeln(T^.Cheie, '_', T^.Info);
                  Inordine(T^.Dr)
                end;
end; { Inordine }

begin
 T:=nil; { iniţial arborele este vid }
 repeat
   writeln('Meniu:');
   writeln('  C - Căutare;');
   writeln('  I - Inserare;');
   writeln('  A - Afişare');
   writeln('  P - Parcurgere în inordine;');
   writeln('  O - Oprirea programului.');
   write('Opţiunea='); readln(c);
   case c of
       'C' : begin
               write('Cheia='); readln(ch);
               Cautare(T, ch, P);
               if P=nil then writeln('Nod inexistent')
                  else writeln(P^.Info);
             end;
       'I' : begin
               write('Cheia='); readln(ch);
               write('Info='); readln(inf);
               Inserare(T, ch, inf);
             end;
       'A' : AfisArb(T, 0);
       'P' : Inordine(T);
       'O' :
       else writeln('Opţiune necunoscută');
   end; { case }
 until c='O';
end.
