tpu/u_arbbii.pas

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

  Arboles binarios de enteros por cursores.
  keywords: arbol binario, cursores

  FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: u_arbbii.pas,v 1.1 2002/04/25 15:57:09 mstorti Exp mstorti $  }

unit u_arbbii;

interface

const
  nodos_max = 100;
  lambda    =   0;

type
  tipo_etiqueta = integer;
  tipo_arbol    = integer;
  curs_nodo     = integer;

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

  bosque_arbbii = object
  private
    nodos : array [1..nodos_max] of nodo;
    disp  : integer ;
    procedure ERROR (s: string);
    function  DISPONIBLE : integer;
  public
    function PADRE    ( n: curs_nodo) : curs_nodo;
    function HIJO_IZQ ( n: curs_nodo) : curs_nodo;
    function HIJO_DER ( n: curs_nodo) : curs_nodo;
    function ETIQUETA ( n: curs_nodo) : tipo_etiqueta;
    function CREA2    ( v: tipo_etiqueta;
                       a1: curs_nodo;
                       a2: curs_nodo) : curs_nodo;
    function  RAIZ    ( a: curs_nodo) : curs_nodo;
    procedure ANULA   ( a: curs_nodo);
    procedure INICIALIZA_NODOS;
    procedure IMPRIME_NODOS;
    function LIBRE : integer;
  end;

implementation

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

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

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function bosque_arbbii.libre : integer;
var
  aux : integer;
begin
  libre := 0;
  aux := disp;
  while (aux <> 0) do begin
    libre := libre + 1;
    aux := nodos [aux].hijo_der;
  end; {while}
end;

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

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

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

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

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function bosque_arbbii.CREA2 (v	 : tipo_etiqueta;
			      a1 : curs_nodo;
			      a2 : curs_nodo ): curs_nodo;
{devuelve un nuevo arbol con raiz etiqueta v,
 y subarboles a1, a2}
var
  temp	: curs_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 bosque_arbbii.RAIZ (a: curs_nodo): curs_nodo;
begin
  RAIZ := a;
end;

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

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

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


Generated by GNU enscript 1.6.1.