Ver Mensaje Individual
  #2 (permalink)  
Antiguo 14/06/2005, 10:45
ferruje
 
Fecha de Ingreso: diciembre-2004
Mensajes: 21
Antigüedad: 19 años, 11 meses
Puntos: 0
Has tenido suerte que hice un examen hace poco de esto... Voy a intentarlo, seguro que hay más formas y eso, pero así lo haría yo. Y como no me has dicho si te pasan sólo el arbol o el arbol y la lista... en fin....
Primero te pongo todos los tipos que voy a usar.... después te creo dos procedimientos dentro de la función, uno que te mete en la lista el dato, y otro que recorre el arbol de forma ordenada.

Código:
type TNodo;
type TPuntero is access TNodo;
type TNodo is
   record
      Dato       : Integer;
      Siguiente : TPuntero := null;
   end record;
type TLista is
   record
      Primero : TPuntero := null;
   end record;
type TNodo_Arbol;
type TPuntero_Arbol is access TNodo_Arbol;
type TNodo_Arbol is
   record
      Dato : Integer;
      Izquierda : TPuntero_Arbol := null;
      Derecha  : TPuntero_Arbol := null;
   end record;
type TArbol is
   record
      Raiz : TPuntero_Arbol := null;
   end record;


function De_Arbol_A_Lista (Arbol : in TArbol) return TLista is
   Lista : TLista;

   procedure Meter_En_Lista (Dato : in Integer) is
      Actual : TPuntero := Lista.Primero;
   begin
      if Actual = null then                      -- La lista esta vacia
         Lista.Primero := new TNodo;
         Lista.Primero.Dato := Dato;
         return;
      end if;
      while Actual.Siguiente /= null loop    -- Vamos al final de la lista y lo 
         Actual := Actual.Siguiente;          -- colocamos
      end loop;
      Actual.Siguiente := new TNodo;
      Actual.Siguiente.Dato := Dato;

   end Meter_En_Lista;


   procedure Recorrer_En_Orden (Puntero : in TPuntero_Arbol) is

   begin
      if Puntero = null then 
         return;
      end if;
      Recorrer_En_Orden (Puntero.Izquierda);
      Meter_En_Lista (Puntero.Dato);
      Recorrer_En_Orden (Puntero.Derecha);
   end Recorrer_En_Orden;

begin
   if Arbol.Raiz = null then
      Lista.Primero := null;
   end;
   Recorrer_En_Orden (Arbol.Raiz);
   return Lista;
end De_Arbol_A_Lista;
P.D.: Lo he tabulado todo para dejarlo ordenado, pero ha pasado de mi.
P.D.2.: Lo he metido todo dentro de un código y ahora si sale tabulado.

Última edición por ferruje; 14/06/2005 a las 10:53