Hola, resolviendo este ejercicio llegue a dos implementaciones distintas y me surgieron estas dudas :
Cual de las dos implementaciones es preferible? Estan bien las implementaciones?
En la primera trate de evitar tener que buscar en cada llamada recursiva el final de la lista y entonces me hice la funcion auxiliar lista enOrdenRec (AB t, lista &l). La idea de l es poder guardarme siempre el final de la lista para no tener que buscarlo al momento de concatenar las listas.
En la segunda implementacion trate de hacerlo usando directamente append y las llamadas recursivas.
// Primera implementacion
lista enOrdenRec (AB t, lista &l) {
if (t != NULL) {
lista finalLeft, finalRight;
lista principio = enOrdenRec(t->izq,finalLeft);
lista nuevo = new nodoLista;
nuevo->elem = t->elem;
if (finalLeft != NULL)
finalLeft->sig = nuevo;
else
finalLeft = nuevo;
nuevo->sig = enOrdenRec(t->der, finalRight);
l = finalRight;
return principio;
}
else {
l = NULL;
return NULL;
}
}
lista enOrden(AB t) {
lista l = crearLista();
return enOrdenRec(t, l);
}
// segunda implementacion
lista enOrdenAppend(AB t) {
if (t == NULL)
return NULL;
else {
lista nuevo = new nodoLista;
nuevo->elem = t->elem;
nuevo->sig = NULL;
lista principio = enOrdenAppend(t->izq);
principio = append(principio, nuevo);
principio = append(principio, enOrdenAppend(t->der));
return principio;
}
}
lista append (lista &inicio,lista final)
Ademas, cuando intente escribir el return de la segunda implementacion como :
return append(append(enOrdenAppen(t->izq), nuevo), enOrdenAppen(t->der));
tuve el siguiente error del compilador: