Primer parcial mayo 2022 - Problema 3

Primer parcial mayo 2022 - Problema 3

de Pablo Andres Balliva Costa -
Número de respuestas: 3

La letra indica que:

El procedimiento puede visitar cada nodo de t a lo sumo una vez, aunque debe evitarse visitar nodos que resulten innecesarios.

Para cumplir con esos requisitos, ¿no falta en la solución un && k > 0 en el primer if? Este ejemplo análogo del teórico (p. 54) sí lo incluye:

void impNivel(AG t, int k) {
  if (t != NULL && k > 0) {
    if (k == 1)
      cout << t->item;
    else
      impNivel(t->pH, k - 1);
    impNivel(t->sH, k);
  }
}

Solución:

void nivelEnLista(AG t, Lista &l, int k) {
  if (t != NULL) {
    if (k == 1) { // inserta al comienzo de l el elemento t->dato
      Lista nuevo = new nodoLista;
      nuevo->dato = t->dato;
      nuevo->sig = l;
      l = nuevo;
    } else
      nivelEnLista(t->pH, l, k - 1); // se recorre el subárbol t->pH
    nivelEnLista(t->sH, l, k);       // Se hace tanto si k==1 como si k>1
  }
}
En respuesta a Pablo Andres Balliva Costa

Re: Primer parcial mayo 2022 - Problema 3

de Carlos Luna -

Hola Pablo

El comentario es correcto en general, si no se asume que k>0. En dicho parcial se establece que k>0 (precondición), asi que la solución planteada es correcta (no hace falta chequear la precondición). 

Saludos, Carlos

En respuesta a Carlos Luna

Re: Primer parcial mayo 2022 - Problema 3

de Pablo Andres Balliva Costa -

Gracias por tu respuesta, Carlos.

Lo que quise señalar es que, como está la solución (sin && k > 0), el algoritmo recorre siempre todos los nodos del árbol. El chequeo de k lo proponía no como verificación de la precondición, sino para que la recursión no siga bajando niveles cuando la lista ya está completa. Me pareció que ese era el espíritu del ejercicio del teórico.

En respuesta a Pablo Andres Balliva Costa

Re: Primer parcial mayo 2022 - Problema 3

de Carlos Luna -

Buen punto!

La condición en ese sentido se justifica. 

La restricción buscaba evitar simplemente que se llamara recursivamente por un subárbol cuando ya se obtuvo la solución por otro o se recorriera un subárbol más de una vez.

Voy a agregar la condición en la solución.

Saludos Carlos