Ejercicio 2.1

Ejercicio 2.1

de Michel Ezequiel Guerrero Da Silva -
Número de respuestas: 4

Lista enOrden(AB a) {

if (a == NULL) {

return NULL;

else {

Lista lizq; //Para guardar la lista resultante de invocar a la función con el subárbol izquierdo

Lista raiz; //Para crear y guardar el nodo que contiene al elemento de la raíz del árbol

Lista lder; //Para guardar la lista resultante de invocar a la función con el subárbol derecho 

lizq = enOrden(a->izq);

raiz = new nodoLista;

raiz->elem = a->elem;

raiz = raiz->siguiente;


lder = enOrden(a->der);


return raiz;

};

}

Buenas, quería consultar si se me puede explicar que debo corregir para llegar al resultado correcto, ya que me está costando como lograr ir uniendo los resultados a medida que voy haciendo las cosas que habia dejado pendientes.

Habia pensado en concatenar ambas listas, pero tampoco se donde iría y tambien queria evitar usar funciones auxiliares.

Muchas gracias.


En respuesta a Michel Ezequiel Guerrero Da Silva

Re: Ejercicio 2.1

de Sofia Tito Virgilio Rodriguez -

Hola Michel,

Tu idea de concatenar ambas listas no está tan errada, el problema en ese caso sería ¿qué pasa con la raiz?

Y en cuanto a dónde, imagino que te referís en qué parte del código, ¿no?

Luego de que tenes en lizq el resultado de ejecutar la instrucción lizq = enOrden(arb->izq), ya podes manipular esa lista.

Lo mismo para manipular lder, luego de lder = enOrden(arb->der).

Luego de que hiciste esas dos invocaciones y guardaste la raíz en el nodo raíz, tenes que buscar la forma de concatenar en el orden correcto esas 3 listas (podes tomar raíz como una lista unitaria, o simplemente como un elemento), teniendo en cuenta que tanto lizq como lder podrían ser vacías. ¿Cuál sería el orden correcto para concatenar estas 3 componentes en un recorrido en orden?

No sé por qué no querés usar funciones auxiliares, pero podes hacer la concatenación luego de las llamadas recursivas y antes del retorno (de todas formas, esto equivale a invocar a una función auxiliar que ejecute ese bloque de código).


En respuesta a Sofia Tito Virgilio Rodriguez

Re: Ejercicio 2.1

de Michel Ezequiel Guerrero Da Silva -

Gracias por el consejo Sofia, asi estaria correcto? lo corri a mano y si no me equivoco estaria bien, saludos!

Lista enOrden(AB a) {

if (a == NULL) {

return NULL;

else {

Lista lizq; //Para guardar la lista resultante de invocar a la función con el subárbol izquierdo

Lista raiz; //Para crear y guardar el nodo que contiene al elemento de la raíz del árbol

Lista lder; //Para guardar la lista resultante de invocar a la función con el subárbol derecho 

lizq = enOrden(a->izq);

raiz = new nodoLista;

raiz->elem = a->elem;

raiz->sig = NULL;


lder = enOrden(a->der);


Lista res = concat(lizq, raiz);

res = concat(res, lder);


return res;

};

}

En respuesta a Michel Ezequiel Guerrero Da Silva

Re: Ejercicio 2.1

de Sofia Tito Virgilio Rodriguez -
Michel,

La solución que presentás es correcta!

Al menos asumiendo bien implementada la función auxiliar concat, aunque si nos ponemos estrictos habría que implementarla también como parte de la solución.

Aprovecho para comentarte que está disponible la solución del práctico 4, por si la querés mirar,

Saludos!