escompleto.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Ejercicio tomado en el Ex\'amen Final del 28/2/2002:
se dice que un \'arbol binario es completo si cada nodo del
mismo o bien es una hoja o bien tiene sus dos hijos.
Escribir una funci\'on recursiva ES_COMPLETO (a: arbol) :
boolean, la cual retorna verdadero si el \'arbol binario 'a'
es completo. Usar las funciones de \'arbol binario:
HIJO_IZQUIERDO (n), HIJO_DERECHO (n), ETIQUETA (n).
keywords: arbol binario
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: escompleto.pas 2002/04/05 12:10 mstroti Exp jdelia $}
program prueba;
uses u_arbbii ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
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 bosque: bosque_arbbii;
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 ['0'..'9'] ) then begin
eti := ord (f) - ord ('0');
aux := SIGUIENTE_FICHA (pos, s);
if ( aux = '{' ) then
begin
n1 := CREA_DE_STRING_REC (s, bosque, pos);
aux := SIGUIENTE_FICHA (pos, s);
if ( aux <> ',' ) then begin
writeln ('No puede encontrar ","');
exit;
end ; {if}
n2 := CREA_DE_STRING_REC (s, bosque, pos);
aux := SIGUIENTE_FICHA (pos,s);
if ( aux <> '}' ) then begin
writeln ('No puede encontrar ","');
exit ;
end ; {if}
CREA_DE_STRING_REC := bosque.crea2 (eti,n1,n2);
end
else begin
DEVUELVE_FICHA (pos, s);
CREA_DE_STRING_REC := bosque.crea2 (eti,lambda,lambda);
end ; {if}
end ; {if}
end ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function CREA_DE_STRING (s: string;
var bosque: bosque_arbbii): curs_nodo ;
var
pos : integer;
begin
pos := 1;
CREA_DE_STRING := CREA_DE_STRING_REC (s, bosque, pos);
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ORD_PREV (n: curs_nodo; b: bosque_arbbii);
begin
if (n = lambda) then exit;
writeln (chr (b.ETIQUETA (n)),' ');
ORD_PREV (b.HIJO_IZQ (n),b);
ORD_PREV (b.HIJO_DER (n),b);
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure IMPRIME_S (n: curs_nodo; b: bosque_arbbii);
var
mi, md: curs_nodo;
begin
if (n = lambda) then begin
write ('0');
exit ;
end ;
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;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function ES_COMPLETO (n: curs_nodo;
b: bosque_arbbii): boolean;
begin
if (n = lambda) then
ES_COMPLETO := false
else if (b.HIJO_IZQ (n) = lambda) <>
(b.HIJO_DER (n) = lambda) then
ES_COMPLETO := false
else begin
ES_COMPLETO :=
( b.HIJO_IZQ (n) = lambda) or
( ES_COMPLETO (b.HIJO_IZQ (n),b) and
ES_COMPLETO (b.HIJO_DER (n),b) )
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ES_COMPLETO_S (s: string; b: bosque_arbbii);
var
n : curs_nodo;
begin
n := crea_de_string (s,b);
writeln ('El arbol ',s,' es completo ? ',ES_COMPLETO (n,b));
b.ANULA (n);
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
bosque: bosque_arbbii; {El bosque donde estan los arboles }
begin
bosque.INICIALIZA_NODOS;
ES_COMPLETO_s ('1{3,5{6{0,7},9}}',bosque); {NO es completo}
ES_COMPLETO_s ('1{3,5{6{3,7},9}}',bosque); {SI es completo}
ES_COMPLETO_s ('1{0,5{6{3,7},9}}',bosque); {NO es completo}
ES_COMPLETO_s ('1{8,5{6{3,7},9{4,2}}}',bosque); { SI lo es}
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.