tpu/ordnodo.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Escribir una function ORDNODO (n: nodo, A:arbol): boolean;
que verifica si cada secuencia de hermanos del subarbol
del nodo "n" (perteneciente al arbol ordenado orientado A)
estan ordenadas entre si, de izquierda a derecha. Por
ejemplo, ver figura, para el arbol de la izquierda deberia
retornar "true", mientras que para el de la derecha deberia
retornar "false", ya que las secuencias de hermanos
indicados en las rayadas NO estan ordenados. Se sugiere el
siguiente algoritmo: para un dado nodo retornar false si:
1) sus hijos no estan ordenados o 2) algunos de sus hijos
contiene en su subarbol una secuencia de hermanos no
ordenada (recursividad).
[Tomado 2do parcial de 2003, 3-Jun-2003]
keywords: arbol orientado
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: ordnodo.pas 2003/06/04 11:26 mstorti Exp jdelia $ }
program ord_nodo_p;
uses u_arborip;
type
arbol = arborip;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function ORD_NODO (n: nodo; a: arbol) : boolean;
var
c : nodo;
e1, e2 : integer;
begin
{ Si el arbol esta vacio entonces asumimos que esta }
{ ordenado (no tiene ninguna secuencia desordenada) }
ORD_NODO := true;
if (n = lambda) then exit;
{ Si es una hoja, esta claro que esta ordenado. Esto es }
{ muy importante ya que es donde se corta la recursividad !!}
c := a.HIJO_MAS_IZQ (n);
if (c = lambda) then exit;
{ Revisa las etiquetas de los hijos. e1, e2 van siendo }
{ dos etiquetas en dos hijos consecutivos. Si se encuentra }
{ algun par desordenado entonces se retorna `false' }
{ Nota: Este lazo y el de abajo se podrian realizar en un solo}
{ lazo, pero de esta forma si las etiquetas de los hijos de}
{ un nodo estan desordenadas, entonces ya no hace falta revisar}
{ sus hijos. Esto puede llegar a ser MUCHO mas eficiente en}
{ ciertos casos }
ORD_NODO := false;
e1 := a.ETIQUETA (c);
c := a.HERMANO_DER (c);
while (c <> lambda) do begin
e2 := a.ETIQUETA (c);
if (e2 < e1) then exit;
e1 := e2;
c := a.HERMANO_DER (c);
end; {while}
{ Ahora aplica la funcion recursivamente a todos los hijos.}
{ Donde encuentra alguno que no viola la condicion ya }
{ puede salir y retornar `false'. }
c := a.HIJO_MAS_IZQ (n);
while (c <> lambda) do begin
if not ORD_NODO (c,a) then exit ;
c := a.HERMANO_DER (c);
end;
{ Si paso todas las condiciones entonces retorna `true'. }
ORD_NODO := true;
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
a : arbol;
n : nodo;
r : boolean;
begin
a.INICIALIZA;
n := a.AGREGA_HIJO_MAS_IZQ (10,lambda);
n := a.AGREGA_HIJO_MAS_IZQ (21,n);
n := a.AGREGA_HERM_DER (30,n);
n := a.AGREGA_HIJO_MAS_IZQ (40,n);
n := a.AGREGA_HERM_DER (51,n);
n := a.AGREGA_HERM_DER (80,n);
n := a.AGREGA_HIJO_MAS_IZQ (60,n);
n := a.AGREGA_HERM_DER (70,n);
a.IMPRIME_ARB ('arbol a: ');
r := ORD_NODO (a.RAIZ, a);
writeln ('Estan ordenadas las secuencias de hijos ? :',r);
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.