Esto se puede resolver de una mejor manera. Además, podemos reducir la complejidad del tiempo a O (n) con una ligera modificación en la estructura de datos y utilizando un enfoque iterativo. Para un análisis detallado y múltiples formas de resolver este problema con varias estructuras de datos.
Aquí hay un resumen de lo que quiero explicar en una publicación mía del blog :
Enfoque recursivo: diámetro del árbol
Otra forma de abordar este problema es la siguiente. Como mencionamos anteriormente, el diámetro puede
- mentir completamente en el subárbol izquierdo o
- mentir completamente en el subárbol derecho o
- puede extenderse a través de la raíz
Lo que significa que el diámetro puede derivarse idealmente por
- el diámetro del árbol izquierdo o
- el diámetro del árbol derecho o
- la altura del subárbol izquierdo + la altura del subárbol derecho + 1 (1 para agregar el nodo raíz cuando el diámetro se extiende por el nodo raíz)
Y sabemos que el diámetro es el camino más largo, por lo que tomamos el máximo de 1 y 2 en caso de que se encuentre en cualquiera de los lados o tome 3 si se extiende a través de la raíz.
Enfoque iterativo: diámetro del árbol
Tenemos un árbol, necesitamos una metainformación con cada nodo para que cada nodo sepa lo siguiente:
- La altura de su hijo izquierdo,
- La altura de su hijo derecho y
- La distancia más lejana entre sus nodos de hoja.
Una vez que cada nodo tiene esta información, necesitamos una variable temporal para realizar un seguimiento de la ruta máxima. Cuando termina el algoritmo, tenemos el valor del diámetro en la variable temporal.
Ahora, necesitamos resolver este problema en un enfoque ascendente, porque no tenemos idea de los tres valores para la raíz. Pero conocemos estos valores para las hojas.
Pasos para resolver
- Inicialice todas las hojas con leftHeight y rightHeight como 1.
- Inicialice todas las hojas con maxDistance como 0, señalamos que si cualquiera de leftHeight o rightHeight es 1, hacemos maxDistance = 0
- Mueva hacia arriba de a uno por vez y calcule los valores para el padre inmediato. Sería fácil porque ahora conocemos estos valores para los niños.
En un nodo dado,
- asigne leftHeight como máximo de (leftHeight o rightHeight de su hijo izquierdo).
- asigne el rightHeight como máximo de (leftHeight o rightHeight de su hijo derecho).
- si alguno de estos valores (leftHeight o rightHeight) es 1, haga maxDistance como cero.
- si ambos valores son mayores que cero, haga maxDistance como leftHeight + rightHeight - 1
- Mantenga maxDistance en una variable temporal y si en el paso 4 maxDistance es mayor que el valor actual de la variable, reemplácelo con el nuevo valor maxDistance.
- Al final del algoritmo, el valor en maxDistance es el diámetro.