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