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.