arbbini.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION

  Representaci\'on de arboles binarios por cursores al
  padre e hijos. keywords: arbol binario

  FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: arbbini.pas v2 2002/04/05 13:20 mstorti Exp jdelia$  }

unit arbbini ;

interface

const
  nodos_max = 100;
  lambda    =   0;
type
  tipo_etiqueta = integer;
  tipo_arbol    = integer;
  tipo_nodo     = integer;

  nodo          = record
  hijo_izq, hijo_der, padre : tipo_nodo;
  etiqueta                  : tipo_etiqueta
  end ;

var
  nodos : array [1..nodos_max] of nodo;
  disp  : integer;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function PADRE    ( n: tipo_nodo) : tipo_nodo;
function HIJO_IZQ ( n: tipo_nodo) : tipo_nodo;
function HIJO_DER ( n: tipo_nodo) : tipo_nodo;
function ETIQUETA ( n: tipo_nodo) : tipo_etiqueta;
function CREA2    ( v: tipo_etiqueta;
                   a1: tipo_arbol;
                   a2: tipo_arbol) : tipo_arbol;
function  RAIZ    ( a: tipo_arbol) : tipo_nodo;
procedure ANULA   ( a: tipo_arbol);
procedure INICIALIZA_NODOS ;
procedure IMPRIME_NODOS;

implementation

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ERROR (s : string);
begin
  write ('error: ');
  writeln (s);
  halt ;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function DISPONIBLE: integer;
begin
  disponible := disp;
  disp       := nodos[disp].hijo_der;
  if ( disp = lambda) then begin
    ERROR ('no hay mas celdas disponibles');
  end ;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function PADRE (n: tipo_nodo): tipo_nodo;
begin
   PADRE := nodos [n].padre ;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function HIJO_IZQ (n: tipo_nodo): tipo_nodo;
begin
   HIJO_IZQ := nodos [n].hijo_izq ;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function HIJO_DER (n: tipo_nodo) : tipo_nodo;
begin
   HIJO_DER := nodos [n].hijo_der ;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function ETIQUETA (n: tipo_nodo) : tipo_etiqueta;
begin
   ETIQUETA := nodos [n].etiqueta;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{devuelve 1 nvo arbol con raiz etiq v y subarboles a1 a2}
function CREA2 ( v: tipo_etiqueta;
                a1: tipo_arbol;
                a2: tipo_arbol ) : tipo_arbol;
var
  temp : tipo_nodo ;
begin
  temp := disponible;
  nodos [temp].etiqueta := v ;
  nodos [temp].hijo_izq := a1 ;
  nodos [temp].hijo_der := a2 ;
  if (a1 <> lambda) then nodos [a1].padre := temp;
  if (a2 <> lambda) then nodos [a2].padre := temp;
  CREA2 := temp;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function RAIZ (a: tipo_arbol): tipo_nodo;
begin
  RAIZ := a ;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ANULA (a: tipo_arbol);
begin
  if ( nodos [a].hijo_izq <> lambda) then begin
     ANULA ( nodos [A].hijo_izq);
  end ;
  if ( nodos [a].hijo_der <> lambda) then begin
     ANULA ( nodos [A].hijo_der);
  end ;
  nodos [a].hijo_izq := lambda;
  nodos [a].hijo_der := disp;
  nodos [a].padre    := lambda;
  disp := a;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure INICIALIZA_NODOS ;
var
  i : integer;
begin
  for i:=1 to nodos_max do begin
    nodos [i].hijo_der := i + 1;
    nodos [i].hijo_izq := lambda;
    nodos [i].padre    := lambda;
    nodos [i].etiqueta := lambda;
  end ;
  nodos [nodos_max].hijo_der := lambda;
  disp := 1;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure IMPRIME_NODOS ;
var
  i : integer;
begin
  for i:=1 to nodos_max do begin
    writeln (' celda, hi, hd, p, etiq ', i,
               nodos [i].hijo_izq, nodos [i].hijo_der,
               nodos [i].padre,    nodos [i].etiqueta);
  end;
end;

end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.