Curso 2024/2025
Compara las dos soluciones siguientes. Fíjate que la primera es mucho más simple.
El orden en que se muestran los nodos en estas soluciones es el de un recorrido en inorden: se muestra el dato de cada nodo después de haber mostrado los de su subárbol izquierdo y antes de mostrar los de su subárbol derecho.
void Conjunto::mostrarOrdenados() const { cout << "{"; mostrarOrdenados(raiz); cout << "}"; } void Conjunto::mostrarOrdenados(Nodo * n) const { if (n != nullptr) { mostrarOrdenados(n->izquierdo); cout << " " << n->dato << " "; mostrarOrdenados(n->derecho); } }
void Conjunto::mostrarOrdenados() const { cout << "{"; if (raiz != nullptr) mostrarOrdenados(raiz); cout << "}"; } void Conjunto::mostrarOrdenados(Nodo * n) const { if (n->izquierdo == nullptr && n->derecho == nullptr) { cout << " " << n->dato << " "; } else if(n->izquierdo == nullptr) { cout << " " << n->dato << " "; mostrarOrdenados(n->derecho); } else if(n->derecho == nullptr) { mostrarOrdenados(n->izquierdo); cout << " " << n->dato << " "; } else { mostrarOrdenados(n->izquierdo); cout << " " << n->dato << " "; mostrarOrdenados(n->derecho); } }
Observa que el método mostrarOrdenados
es void
, no devuelve
nada (muestra algo en la salida estándar, pero no lo
devuelve con return
). Sería incorrecto tratar de utilizar
el operador << con lo que devuelve cuando no devuelve nada,
p. ej. así: cout << mostrarOrdenados(n->izquierdo);
Por el mismo motivo, también sería incorrecto poner return
delante
de las llamadas recursivas para devolver lo que nos devuelven,
p. ej. así: return mostrarOrdenados(n->izquierdo);
La solución 2 fallaría cuando el conjunto estuviese vacío si
quitásemos if (raiz != nullptr)
.