Home Algoritmos y Estructuras de Datos (VJ1215)

Curso 2023/2024

Ejemplos de errores en el ejercicio 9.d del tema 3

Piensa cuáles son los errores en las siguientes soluciones incorrectas.

Ejemplo de solución incorrecta 1

vector<int> Conjunto::obtenerOrdenados() const {
   vector<int> v(laTalla);
   obtenerOrdenados(raiz, v, 0);
   return v;
}

void Conjunto::obtenerOrdenados(Nodo * n, vector<int> & v, int i) const {
   if (n != nullptr) {
      obtenerOrdenados(n->izquierdo, v, i);
      v[i++] = n->dato;
      obtenerOrdenados(n->derecho, v, i);
   }
}
	

¿Por qué es incorrecta?

Al no pasar i por referencia, lo que se incremente es una copia que no ven todas las llamadas.

Ejemplo de solución incorrecta 2

vector<int> Conjunto::obtenerOrdenados() const {
   vector<int> v(laTalla);
   obtenerOrdenados(raiz, v, 0);
   return v;
}

void Conjunto::obtenerOrdenados(Nodo * n, vector<int> & v, int & i) const {
   if (n != nullptr) {
      obtenerOrdenados(n->izquierdo, v, i);
      v[i++] = n->dato;
      obtenerOrdenados(n->derecho, v, i);
   }
}
	

¿Por qué es incorrecta?

No podemos pasar un valor constante (en este caso, 0) en un argumento por referencia.

Ejemplo de solución incorrecta 3

vector<int> Conjunto::obtenerOrdenados() const {
   vector<int> v(laTalla);
   int i = 0;
   return obtenerOrdenados(raiz, v, i);
}

void Conjunto::obtenerOrdenados(Nodo * n, vector<int> & v, int & i) const {
   if (n != nullptr) {
      obtenerOrdenados(n->izquierdo, v, i);
      v[i++] = n->dato;
      obtenerOrdenados(n->derecho, v, i);
   }
}
	

¿Por qué es incorrecta?

Sobra return donde está, porque el segundo método no devuelve nada, no podemos devolver con return lo que no devuelve, y falta return v (solamente al final del primer método).