incluido.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Ejercicio tomado en el Ex\'amen final del 14/12/01:
escribir una funci\'on INCLUIDO (B, A: nodo) : boolean, la
cual retorna verdadero si la estructura del \'arbol $B$
est\'a incluida dentro de la del \'arbol $A$. Definiendolo
en forma recursiva, un \'arbol $B$ est\'a incluido en otro
$A$ si: (B=Lambda) or (A<>Lambda). La estructura de los
hijos de $B$ est\'a incluida en la estructura de los
correspondientes hijos de $A$. Se pide:
(a) Explicar el significado de la condici\'on
(B=Lambda) or (A<>Lambda);
(b) Escribir el procedimiento function INCLUIDO (B,A: nodo):
boolean, utilizando las funciones PADRE (n,A),
HIJO_MAS_IZQUIERDO (n,A), HERMANO_DERECHO (n,A),
ETIQUETA (n,A), CREA0 (v), CREA1 (v,A1), CREA2 (v,A1,A2).
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{$ Id: incluido.pas 2002/04/05 13:30 mstorti Exp jdelia $ }
program p_incluido ;
uses u_arbori;
type
bosque = bosque_arbori ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ORD_PREV (A: curs_nodo; B: bosque);
var
temp : curs_nodo;
begin
if (A <> lambda) then begin
writeln (B.ETIQUETA (A));
temp := B.HIJO_MAS_IZQ (A);
while (temp <> lambda) do begin
ORD_PREV (temp,B);
temp := B.HERMANO_DER (temp);
end; {while}
end; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ORD_POST (A: curs_nodo; B: bosque);
var
temp : curs_nodo;
begin
if (A <> lambda) then begin
temp := B.HIJO_MAS_IZQ (A);
while (temp <> lambda) do begin
ORD_POST (temp,B);
temp := B.HERMANO_DER (temp);
end; {while}
writeln (B.ETIQUETA (A));
end; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function INCLUIDO (B, A: curs_nodo;
BB: bosque) : boolean;
var
mA, mB: curs_nodo;
begin
if not ( (B = lambda) or (A <> lambda) ) then begin
INCLUIDO := false;
exit;
end; {if}
mA := BB.HIJO_MAS_IZQ (A);
mB := BB.HIJO_MAS_IZQ (B);
while ( mB <> lambda) do begin { B tiene nas hijos que A }
if not INCLUIDO (mB, mA, BB) then
begin {uno de los hijos no es semejante }
INCLUIDO:=false;
exit;
end; {if}
mA := BB.HERMANO_DER (mA);
mB := BB.HERMANO_DER (mB);
end; {while}
INCLUIDO := true;
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
BB : bosque;
n33, n12, n13, n14, n21 : curs_nodo;
begin
BB.INICIALIZA_NODOS;
n33 := BB.CREA0 (33);
n12 := BB.AGREGA_HIJO_MAS_IZQ (n33, 12);
n14 := BB.AGREGA_HERM_DER (n12, 14);
n13 := BB.AGREGA_HIJO_MAS_IZQ (n12, 13);
n21 := BB.AGREGA_HERM_DER (n13, 21);
writeln ('Listado en orden previo: ');
ORD_PREV (n33, BB);
writeln ('Listado en orden posterior: ');
ORD_POST (n33, BB);
writeln ('Incluido 33 en 33: (deberia ser true ) ',
INCLUIDO (n33, n33, BB));
writeln ('Incluido 12 en 33: (deberia ser true ) ',
INCLUIDO (n12, n33, BB));
writeln ('Incluido 33 en 12: (deberia ser false) ',
INCLUIDO (n33, n12, BB));
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.