EJ 9 sol

EJ 9 sol

de Fabricio Gabriel Techera Rosado -
Número de respuestas: 1

int mayorAmplitudRec(AG a, int x)

{

if (a == NULL)

return x;

else 

{

if( mayorAmplitudRec(a->pH, 0) > mayorAmplitudRec(a->sH, x+1))

return mayorAmplitudRec(a->pH, 0);

else

return mayorAmplitudRec(a->sH, x+1);

}

}


int mayorAmplitud (AG a)

{

if(a == NULL || esArbolHoja(a))

return 0;

else

return mayorAmplitudRec(a->pH, 0);

}

quisiera saber si esta solucion alternativa a la del pdf de soluciones del prac4 es valida.

En respuesta a Fabricio Gabriel Techera Rosado

Re: EJ 9 sol

de Fernando Fernandez -

Esto es de menor importancia, pero esArbolHoja es de otro ejercicio. Habría que implementarla, aunque es  fácil. Pero creo que no necesitás ese caso base.

Segundo. En la condición se hacen llamadas a funciones. Luego se vuelve a hacer una de esas llamadas. Esto puede ser muy costoso. Conviene asignar el resultado de las llamadas a variables y después trabajar con ellas.

En lo fundamental creo que da el resultado correcto.

Pero, puede ser una visión personal, me parece demasiado complicado.

No queda claro, desde un punto de vista conceptual, que es lo que devuelve la función auxiliar al invocarla en un nodo genérico. No es la amplitud del árbol que tiene raíz en ese nodo. No es la amplitud del conjunto de árboles que incluyen ese mismo árbol y todos sus hermanos hacia la derecha. No es la amplitud del conjunto de árboles en el que se incluyen también sus hermanos hacia la izquierda. Creo que devuelve la máxima amplitud entre el árbol, sus hermanos hacia la derecha y el padre. ¿Puede ser?

¿El objetivo es mejorar la eficiencia al evitar el segundo recorrido que se hace al calcular la cantidad de hijos? Si es el objetivo es un buen motivo y una solución que parece correcta. Creo que sería mejor que la función devuelva dos valores, la amplitud y la cantidad de hermanos que tiene el nodo hacia la derecha (tal vez incluido el mismo). Esto se puede hacer creando un tipo con dos campos. O de manera alternativo haciendo que la x sea pasada por referencia para que sea una variable de salida (pero sin asignarle un valor de entrada).

Repito lo que dije antes, es un problema de claridad acerca de qué hace una función. Y qué es más claro puede depender del ojo del que mira.

En resumen, creo que es correcto y lo que tendrías que modificar son los dos puntos que puse al principio.