Home Algoritmos y Estructuras de Datos (VJ1215)

Curso 2024/2025

Solución del ejercicio 2.f del tema 3

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.

Solución 1

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);
  }
}
	

Solución 2

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);

   }

}
	

Ejemplos de errores

  1. 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);

  2. 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);

  3. La solución 2 fallaría cuando el conjunto estuviese vacío si quitásemos if (raiz != nullptr).