tpu/u_arbbir.pas

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

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

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

interface

const
  nodos_max = 20;
  lambda    = 0;

type
  tipo_etiqueta = real;
  tipo_arbol    = integer;
  curs_nodo     = integer;
  arbbir        = curs_nodo;

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

  bosque_arbbir = 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;
  end;

  implementation

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

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function bosque_arbbir.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_arbbir.PADRE (n: curs_nodo): curs_nodo;
begin
  PADRE := nodos [n].padre;
end;

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

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

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

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function bosque_arbbir.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_arbbir.RAIZ (a: curs_nodo): curs_nodo;
begin
  RAIZ := a;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure bosque_arbbir.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_arbbir.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 ; {for}
  nodos [nodos_max].hijo_der := lambda;
  disp := 1;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure bosque_arbbir.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 ; {for}
end;

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

Generated by GNU enscript 1.6.1.