861
Aprender a programar desde cero / Re:Arboles binarios en Java recursividad obtener LinkedList de nodos hoja código
« en: 13 de Julio 2018, 01:44 »
Para trazar esto.... se necesita papel, lápiz y bebidas azucaradas para tener combustible en la sesera ja ja...
Viendo tu explicación, ahora me doy cuenta de lo evidente.
Que en cuanto un arbol tiene al menos dos hojas, entonces se dará esta condicion:
Si hay 3 hojas, se retornaría una suma recursiva (los parentesis representan la suma recursiva):
(1 + 1) + 1 si la ramificacion más profunda está por la izquierda,
1 + (1 + 1) si estuviese por la derecha.
Si hay 4 hojas: (1 + 1) + (1 + 1)
5 hojas: ((1 + 1) + 1) + (1 + 1) si la ramificación más profunda estuviese a la izquierda
etc...
En definitiva, excepto cuando solo hay una hoja en todo el arbol, a partir de dos o más hojas siempre tendremos sumas y más sumas recursivas.
De ahí que no se cumpla mi inicial temor de que solo iba a recibir un 0 incrementado en 1.
Yo no veía en qué momento ese 0 incrementado en 1, llegaría a ser un 1 incrementado a 2, y luego un 2 incrementado a 3, etc....
Y es que esto no ocurre nunca, y de hecho ¡¡no hace falta que ocurra!!
Lo que recibimos son una suma de muchos 0 incrementados en 1.
Y por ello, el método funciona perfectamente, ¡¡oh yeah!!
De hecho funciona así precisamente porque el dato primitivo se está pasando "por valor"
Si estuviese pasandose "por referencia", ocurriría un despropósito.
Y lo acabo de comprobar modificando los metodos para en lugar de pasarle un 0 como int primitivo, pasarle un vector int[] que contiene el 0.
Cambio en clase Nodo:
Cambio en clase Arbol:
De este modo, el conteo de hojas falla y me dice que hay 10, en lugar de 4.
Y yo que ayer pensaba que quizás me funcionaba porque de algún modo el 0 int primitivo estaba pasándose "por referencia"...
Vaya giros inesperados da la vida ja ja ja ...
Muy didáctico ha sido este ejercicio. Un saludo.
Viendo tu explicación, ahora me doy cuenta de lo evidente.
Que en cuanto un arbol tiene al menos dos hojas, entonces se dará esta condicion:
Código: [Seleccionar]
else if (izq != null && der != null)
return izq.cuentaHojas(hojas) + der.cuentaHojas(hojas);
y se retornará, al menos, una suma de resultados: 1 + 1.Si hay 3 hojas, se retornaría una suma recursiva (los parentesis representan la suma recursiva):
(1 + 1) + 1 si la ramificacion más profunda está por la izquierda,
1 + (1 + 1) si estuviese por la derecha.
Si hay 4 hojas: (1 + 1) + (1 + 1)
5 hojas: ((1 + 1) + 1) + (1 + 1) si la ramificación más profunda estuviese a la izquierda
etc...
En definitiva, excepto cuando solo hay una hoja en todo el arbol, a partir de dos o más hojas siempre tendremos sumas y más sumas recursivas.
De ahí que no se cumpla mi inicial temor de que solo iba a recibir un 0 incrementado en 1.
Yo no veía en qué momento ese 0 incrementado en 1, llegaría a ser un 1 incrementado a 2, y luego un 2 incrementado a 3, etc....
Y es que esto no ocurre nunca, y de hecho ¡¡no hace falta que ocurra!!
Lo que recibimos son una suma de muchos 0 incrementados en 1.
Y por ello, el método funciona perfectamente, ¡¡oh yeah!!
De hecho funciona así precisamente porque el dato primitivo se está pasando "por valor"
Si estuviese pasandose "por referencia", ocurriría un despropósito.
Y lo acabo de comprobar modificando los metodos para en lugar de pasarle un 0 como int primitivo, pasarle un vector int[] que contiene el 0.
Cambio en clase Nodo:
Código: [Seleccionar]
public int cuentaHojas(int[] hojas) {
if (izq == null && der == null)
return ++hojas[0];//No hay nodos, es una hoja
else if (izq != null && der != null)
return izq.cuentaHojas(hojas) + der.cuentaHojas(hojas);
else if (izq != null && der == null)
return izq.cuentaHojas(hojas);
else
return der.cuentaHojas(hojas);
}
Cambio en clase Arbol:
Código: [Seleccionar]
public int contarHojas() {
int[] v = {0};
return raiz.cuentaHojas(v);
}
De este modo, el conteo de hojas falla y me dice que hay 10, en lugar de 4.
Y yo que ayer pensaba que quizás me funcionaba porque de algún modo el 0 int primitivo estaba pasándose "por referencia"...
Vaya giros inesperados da la vida ja ja ja ...
Muy didáctico ha sido este ejercicio. Un saludo.