caminoord.pas

{ COMIENZO DE DESCRIPCION

Dado un arbol ordenado binario A y un nodo n escribir una funcion
CAMINO_ORD(n: nodo, A:arbol): boolean; que retorna verdadero si existe
algun camino ordenado desde n a una hoja en el subarbol del nodo
n. Por ejemplo en el caso del arbol de la izquierda en la figura de
abajo debe retornar true ya que el camino marcado con lineas de puntos
esta ordenado de menor a mayor yendo desde la raiz a la hoja, mientras
que para el de la derecha debe retornar false ya que no existe ningun
camino con esas caracteristicas. Se sugiere el siguiente algoritmo: Un
dado nodo n debe retornar true si, o bien es una hoja, o bien alguno
de sus hijos c contiene un camino ordenado y ETIQUETA(c)>ETIQUETA(n).
[Tomado 2do parcial de 2003, 3-Jun-2003]
keywords: arbol binario

FIN DE DESCRIPCION }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: caminoord.pas,v 1.3 2003/06/04 11:19:48 mstorti Exp mstorti $  }

program camino_ord_p;

uses u_arbbii, arbbtools;

type
   bosque	= bosque_arbbii;

function camino_ord(n : curs_nodo; A: bosque) : boolean;
var
   ci,cd : curs_nodo;
   e : integer;
begin 
   camino_ord := true;

   { El nodo no existe }
   if n=Lambda then exit;

   e := A.etiqueta(n); ci := A.hijo_izq(n); cd := A.hijo_der(n);

   { El nodo es una hoja }
   if (ci=Lambda) and (cd=Lambda) then exit;

   { Existe un camino ordenado por el hijo izquierdo }
   if (ci<> Lambda) and camino_ord(ci,A) and (A.etiqueta(ci)>e) then exit;

   { Existe un camino ordenado por el hijo derecho }
   if (cd<> Lambda) and camino_ord(cd,A) and (A.etiqueta(cd)>e) then exit;
   
   { No existe camino ordenado  }
   camino_ord := false;
   
end; { camino_ord }

procedure test_tree(s : string; A:bosque);
var
   n : curs_nodo;
begin
   write('arbol: ',s,' Existe camino ord: ');
   n := crea_de_string(s,A);
   if camino_ord(n,A) then
      writeln('SI')
   else
      writeln('NO');
end;   

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
   A : bosque;
   n,m : curs_nodo;
   k : integer;
begin
   A.inicializa_nodos;
   test_tree('1{8{3,2},4{9,2}}',A);
   test_tree('1{8{3,2},4{2,2}}',A);
   test_tree('1{8{3,2},4{8{5,9},2}}',A);
   test_tree('1{8{3,2},4{8{5,7},2}}',A);
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.