parcord.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
  Se dice que un \'arbol binario es `parcialmente ordenado'
  (PO) si la etiqueta de cada nodo es menor o igual que las
  etiquetas de sus hijos. As\'\i\, por ejemplo, el \'arbol
  1(2,3(4,5)) es parcialmente ordenado, pero el 5(2,3(4,5))
  no lo es porque 5 es mayor que su hijo 2.
  Entonces, escribir una
  funci\'on `VERIFICA\_PO(n:nodo; A: Arbol): boolean' que
  retorna `true' si el sub\'arbol que cuelga del nodo n es
  parcialmente ordenado y `false' en caso contrario. Usar
  las primitivas del `TAD ARBOL BINARIO:', `HIJO\_IZQ(n,A)',
  `HIJO\_DER(n,A)', `ETIQUETA(n,A)'.
  [Tomado en el segundo parcial del cursado 2002, 28/5/2002]
  keywords: arbol binario
FIN DE DESCRIPCION }

{ Por simplicidad hemos usado arboles etiquetados con}
{ caracteres, tomando como relacion de orden el orden}
{ alfabetico usual. }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: parcord.pas 2002/05/22 19:59 mstorti Exp mstorti  $ }
program parcord ;
uses u_arbbii;
type
  bosque = bosque_arbbii ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function VERIF_PO (n: curs_nodo; a: bosque ): boolean ;
var
   c       : curs_nodo;
   ret_val : boolean;
begin
   if (n = lambda) then { lambda siempre verifica !! }
      ret_val := true
   else begin
      ret_val := true;
      { Verifica que el hijo izq. satisface y que todo su}
      { subarbol tambien (recursivamente) }
      c := a.HIJO_IZQ (n);
      if (c <> lambda) then
         ret_val := ret_val and VERIF_PO (c,a) and
         (a.ETIQUETA (n) <= a.ETIQUETA (c) );
      { Idem. hijo derecho }
      c := a.HIJO_DER (n);
      if (c <> lambda) then
         ret_val := ret_val and VERIF_PO (c,a) and
         (a.ETIQUETA (n) <= a.ETIQUETA (c));
   end; {if}
   VERIF_PO := ret_val;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function SIGUIENTE_FICHA (var pos: integer; s: string): char;
begin
   SIGUIENTE_FICHA := s [pos];
   pos := pos + 1;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure DEVUELVE_FICHA (var pos: integer; s: string);
begin
   pos := pos - 1;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function CREA_DE_STRING_REC (s : string;
                             var bos: bosque;
                             var pos: integer): curs_nodo ;
var
  eti    : integer;
  f, aux : char;
  n1, n2 : curs_nodo;
begin
  f := SIGUIENTE_FICHA (pos,s);
  if (f = '0') then
    CREA_DE_STRING_REC := lambda
  else if (f in ['a'..'z']) then
    begin
    eti := ord (f);
    aux := SIGUIENTE_FICHA (pos,s);
    if (aux ='{') then
      begin
      n1 := CREA_DE_STRING_REC (s, bos, pos);
      aux:= SIGUIENTE_FICHA (pos,s);
      if (aux <> ',') then begin
        writeln('No puede encontrar ","');
        exit;
      end; {if}
      n2 := CREA_DE_STRING_REC (s, bos, pos);
      aux:= SIGUIENTE_FICHA (pos,s);
      if (aux <>'}') then begin
         writeln ('No puede encontrar ","');
         exit;
      end; {if}
      CREA_DE_STRING_REC := bos.CREA2 (eti,n1,n2);
      end {then}
    else begin
      DEVUELVE_FICHA (pos,s);
      CREA_DE_STRING_REC := bos.CREA2 (eti, lambda, lambda);
    end ; {if}
  end ; {if}
end; { CREA_DE_STRING_REC }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function CREA_DE_STRING (s: string;
                         var bos: bosque): curs_nodo ;
var
  pos : integer;
begin
  pos := 1;
  CREA_DE_STRING := CREA_DE_STRING_REC (s,bos,pos);
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure IMPRIME_S (n: curs_nodo; b: bosque);
var
  mi, md: curs_nodo;
begin
  if (n = lambda) then begin
    write('0');
    exit;
  end; {if}
  write ( chr ( b.ETIQUETA (n) ));
  mi := b.HIJO_IZQ (n);
  md := b.HIJO_DER (n);
  if ( mi <> lambda ) or ( md <> lambda ) then begin
    write('{');
    IMPRIME_S (mi,b);
    write (',');
    IMPRIME_S (md,b);
    write ('}');
  end; {if}
  if ( b.PADRE (n) = lambda) then writeln ('');
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
   n : curs_nodo;
   B : bosque ; {El bosque donde estan los arboles }
begin
   B.INICIALIZA_NODOS ;
   n := CREA_DE_STRING ('a{b,c{d{0,f},e}}', B);
   IMPRIME_S (n, B);
   writeln('Es parcialmente ordenado? :', VERIF_PO (n,b));
   n := CREA_DE_STRING ('a{b,c{d{0,c},a}}', B);
   IMPRIME_S (n, B);
   writeln('Es parcialmente ordenado? :', VERIF_PO (n,b));
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.