oparboles.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Diversas operaciones con \'arboles binarios:
CREA_DE_STRING: permite ingresar \'arboles con
``a(b,c(d,r))'';
IMPRIME_S: imprime en el mismo formato;
SEMEJANTE: determina si la estructura de dos \'arboles
es la misma;
ES_ESPEJO: determina si la estructura de un \'arbol es
la espejada de otro;
IGUALES: determina si dos \'arboles son iguales,
en estructura y contenido;
INCLUIDO: determina si la estructura de un \'arbol
est\'a contenido en la de otro;
COPIA: copia un \'arbol en otro;
COPIA_ESPEJO: copia un \'arbol en otro en forma espejada;
INTERSECCION: determina aquella parte de la estructura
que es com\'un a dos \'arboles.
keywords: arbol binario
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: oparboles.pas 2002/04/30 11:00 mstorti Exp jdelia $ }
program oparboles ;
uses u_arbbii;
type
bosque = bosque_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 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
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 ORD_PREV (n: curs_nodo; b: bosque);
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);
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;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function SEMEJANTE (n1, n2: curs_nodo; b: bosque): boolean;
begin
if (n1 <> Lambda) xor (n2 <> Lambda) then
SEMEJANTE := false
else if (n1 = Lambda) then
SEMEJANTE := true
else begin
SEMEJANTE :=
SEMEJANTE ( b.HIJO_IZQ (n1), b.HIJO_IZQ (n2), b) and
SEMEJANTE ( b.HIJO_DER (n1), b.HIJO_DER (n2), b)
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure SEMEJANTE_W (n1, n2: curs_nodo; B: bosque);
begin
if SEMEJANTE (n1, n2, B) then
writeln ('Son semejantes!! :-) ')
else begin
writeln ('No son semejantes!! :-((')
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function ES_ESPEJO (n1, n2: curs_nodo; B: bosque): boolean;
begin
if (n1 <> Lambda) xor (n2 <> Lambda) then
ES_ESPEJO := false
else if (n1 = Lambda) then
ES_ESPEJO := true
else begin
ES_ESPEJO :=
ES_ESPEJO (B.HIJO_IZQ (n1), B.HIJO_DER (n2), B) and
ES_ESPEJO (B.HIJO_DER (n1), B.HIJO_IZQ (n2), B)
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ES_ESPEJO_W (n1, n2: curs_nodo; B: bosque);
begin
if ES_ESPEJO (n1, n2, B) then
writeln ('Es el espejo!! :-)')
else begin
writeln('No es el espejo!! :-((')
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function IGUALES (n1, n2: curs_nodo; B: bosque): boolean;
begin
if (n1 <> Lambda) xor (n2<>Lambda) then
IGUALES := false
else if (n1 = Lambda) then
IGUALES := true
else if B.ETIQUETA (n1) <> B.ETIQUETA (n2) then
IGUALES := false
else begin
IGUALES :=
IGUALES (B.HIJO_IZQ (n1), B.HIJO_IZQ (n2), B) and
IGUALES (B.HIJO_DER (n1), B.HIJO_DER (n2), B)
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure IGUALES_W (n1, n2: curs_nodo; B: bosque);
begin
if IGUALES (n1, n2, B) then
writeln ('Son iguales!! :-)')
else begin
writeln ('No son iguales!! :-((');
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function INCLUIDO (n1, n2: curs_nodo; B: bosque) : boolean;
begin
if (n1 = Lambda) then
INCLUIDO := true
else if (n2 = Lambda) then
INCLUIDO := false
else begin
INCLUIDO :=
INCLUIDO (B.HIJO_IZQ (n1), B.HIJO_IZQ (n2), B) and
INCLUIDO (B.HIJO_DER (n1), B.HIJO_DER (n2), B)
end ;{if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure INCLUIDO_W (n1, n2 : curs_nodo; B: bosque);
begin
if INCLUIDO (n1,n2,B) then
writeln ('Esta incluido!! :-)')
else begin
writeln ('NO esta incluido!! :-((')
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function COPIA (n: curs_nodo; var B: bosque): curs_nodo;
var
nuevo_hi, nuevo_hd : curs_nodo;
begin
if (n = Lambda) then
COPIA := Lambda
else begin
nuevo_hi := COPIA (B.HIJO_IZQ (n), B);
nuevo_hd := COPIA (B.HIJO_DER (n), B);
COPIA := B.CREA2 (B.ETIQUETA (n), nuevo_hi, nuevo_hd)
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function COPIA_ESPEJO ( n: curs_nodo;
var B: bosque): curs_nodo;
var
nuevo_hi, nuevo_hd : curs_nodo;
begin
if (n = Lambda) then
COPIA_ESPEJO := Lambda
else begin
nuevo_hi := COPIA_ESPEJO (B.HIJO_DER (n), B);
nuevo_hd := COPIA_ESPEJO (B.HIJO_IZQ (n), B);
COPIA_ESPEJO := B.CREA2 (B.ETIQUETA(n),nuevo_hi,nuevo_hd)
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function INTERSECCION (n1, n2: curs_nodo;
var B: bosque): curs_nodo;
var
nuevo_hi, nuevo_hd : curs_nodo;
begin
if (n1 = Lambda) or (n2 = Lambda) then
INTERSECCION := Lambda
else begin
nuevo_hi := INTERSECCION (B.HIJO_IZQ (n1),
B.HIJO_IZQ (n2), B);
nuevo_hd := INTERSECCION (B.HIJO_DER (n1),
B.HIJO_DER (n2), B);
INTERSECCION := B.CREA2 (B.ETIQUETA (n1),
nuevo_hi, nuevo_hd)
end ; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
n1, n2 : curs_nodo;
n3, n4 : curs_nodo;
B : bosque ; {El bosque donde estan los arboles }
begin
B.INICIALIZA_NODOS ;
n1 := CREA_DE_STRING ('a{b,c{d{0,f},e}}', B);
IMPRIME_S (n1, B);
n2 := CREA_DE_STRING ('q{k,l{d{0,m},p}}', B);
SEMEJANTE_W (n1, n2, B); { SI son semejantes ... }
IGUALES_W (n1, n2, B); { NO son iguales ... }
B.ANULA (n2);
n2 := CREA_DE_STRING ('q{k,l{d{r,m},p}}', B);
SEMEJANTE_W (n1, n2, B); { NO son semejantes }
INCLUIDO_W (n1, n2, B); { Esta incluido!! :-) }
B.ANULA (n2);
n2 := CREA_DE_STRING ('q{k,l{0,p{q,r}}}', B);
INCLUIDO_W (n1, n2, B); { NO esta incluido!! :-(( }
n3 := COPIA (n2, B);
B.ANULA (n2);
IMPRIME_S (n3, B); { La copia sigue existiendo en n3 }
B.ANULA (n3);
n2 := CREA_DE_STRING ('q{k,l{0,p{q,r}}}', B);
n3 := COPIA_ESPEJO (n2, B);
IMPRIME_S (n3, B); { Copia espejada }
ES_ESPEJO_W (n2, n3, B); {Es el espejo ... }
ES_ESPEJO_W (n2, n2, B); {Falso porque no es simetrico}
n4 := INTERSECCION (n2, n3, B);
IMPRIME_S (n4, B);
ES_ESPEJO_W (n4, n4, B);
{ Verdadero: porque n4 es la interseccion de n2 con su
espejo y por lo tanto es simetrico }
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.