maxhoja.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
a) Escribir un procedure HOJAS (A: arbol; n: nodo);
que lista las etiquetas de las hojas de un \'arbol
ordenado orientado. Por ejemplo, en el
\'arbol (142 (63 (33) 42 (23 7 35)) 48 125 (130 12))
debe listar: 33 23 7 35 48 130 12.
b) Escribir una function MAXHOJA (A: arbol; n: nodo):integer;
que retorna el m\'aximo de las etiquetas de las hojas
de un \'arbol ordenado orientado. Por ejemplo, en el
\'arbol (142 (63 (33) 42 (23 7 35)) 48 125 (130 12))
debe retornar 130.
keywords: arbol orientado
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ Ejemplo: 142
/ | \
63 48 125
/ \ / \
33 42 130 12
/ | \
23 7 35 }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: maxhoja.pas v3 2003/04/14 7:02 mstorti Exp jdelia $}
program phojas;
uses u_arbori;
type
bosque = bosque_arbori;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure HOJAS (A: bosque; n: curs_nodo);
var
c : curs_nodo;
begin
if (n = lambda) then
else if (A.HIJO_MAS_IZQ (n) = lambda) then {Es una hoja}
writeln ('hoja = ', A.ETIQUETA (n) )
else begin { Es un nodo interior }
c := A.HIJO_MAS_IZQ (n);
while (c <> lambda) do begin
HOJAS (A, c);
c := A.HERMANO_DER (c);
end; {while}
end; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function MAXHOJA (A : bosque; n : curs_nodo) : integer;
var
c : curs_nodo;
r, v: integer;
begin
r := 0;
if (n = lambda) then
{ No hace nada. r=0 esta OK }
else if (A.HIJO_MAS_IZQ (n) = lambda) then
{Es una hoja, retorna la etiqueta. }
r := A.ETIQUETA (n)
else begin
{Es un nodo interior. Retorna el maximo de los MAXHOJAS}
{de los hijos: Sin tener en cuenta la etiqueta de n!!}
c := A.HIJO_MAS_IZQ (n);
while (c <> lambda) do begin
v := MAXHOJA (A,c);
if (v > r) then r := v;
c := A.HERMANO_DER (c);
end; {while}
end; {if}
MAXHOJA := r;
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ORD_PREV (B: bosque; n: curs_nodo);
var
c : curs_nodo;
begin
if (n <> lambda) then begin
write (B.ETIQUETA (n),' ');
c := B.HIJO_MAS_IZQ (n);
while (c <> lambda) do begin
ORD_PREV (B,c);
c := B.HERMANO_DER (c);
end; {while}
end; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ORD_POST (B: bosque; n: curs_nodo);
var
c : curs_nodo;
begin
if (n <> lambda) then begin
c := B.HIJO_MAS_IZQ (n);
while (c <> lambda) do begin
ORD_POST (B, c);
c := B.HERMANO_DER (c);
end; {while}
write (B.ETIQUETA (n),' ');
end; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ORD_SIM (B: bosque; n: curs_nodo);
var
c : curs_nodo;
begin
if (n <> lambda) then begin
c := B.HIJO_MAS_IZQ (n);
ORD_SIM (B, c);
write (B.ETIQUETA (n),' ');
if (c <> lambda) then begin
c := B.HERMANO_DER (c);
while (c <> lambda) do begin
ORD_SIM (B, c);
c := B.HERMANO_DER (c);
end; {while}
end; {if}
end; {if}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
A : bosque ;
carb : array [1..100] of curs_nodo;
n : curs_nodo;
begin
A.INICIALIZA_NODOS;
carb [1] := A.CREA0 (33);
carb [2] := A.CREA0 (23);
carb [3] := A.CREA0 (7);
carb [4] := A.CREA0 (35);
carb [5] := A.CREA0 (130);
carb [6] := A.CREA0 (12);
carb [7] := A.CREA3 (42, carb [2], carb [3], carb [4]);
carb [8] := A.CREA2 (63, carb [1], carb [7]);
carb [9] := A.CREA0 (48);
carb [10]:= A.CREA2 (125, carb [5], carb [6]);
n := A.CREA3 (142, carb [8], carb [9], carb [10]);
writeln ;
writeln ('listado en orden previo');
ORD_PREV (A, n);
writeln ;
writeln ;
HOJAS (A,n);
writeln ;
writeln ('MAXHOJA: ', MAXHOJA (A,n));
writeln ;
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.