¿Cuál es la complejidad temporal de una función que calcula la altura de un árbol binario de forma recursiva? ¿Es O (N) u O (NlogN)?

Definitivamente no es O (NlogN) , pero para conocer la complejidad real no proporciona suficientes datos. Puede ser mejor que O (N) . La respuesta depende del tipo de árbol binario.

Si no tenemos ninguna información sobre el árbol, podemos terminar visitando cada nodo del árbol una vez, pero no sería necesario que hagamos más que eso. Por lo tanto, O (N) definitivamente será suficiente.

Si se trata de un árbol equilibrado (porque esa propiedad se aseguró al construir el árbol), solo necesitaremos seguir una rama y las propiedades de los árboles equilibrados asegurarán que las longitudes de las ramas sean O (log (N)) .

Pero incluso podríamos construir nuestro árbol para que cada nodo esté etiquetado con la altura del subárbol. Luego, conocer la altura del árbol se convertirá en O (1) : solo mire el valor que se mantiene en el nodo.

Por supuesto, los árboles no triviales necesitan un esfuerzo adicional y no lo haríamos sin un propósito específico.

Para cada nodo del árbol, la función recursiva se llama una vez. También realiza una secuencia fija de operaciones. Pronto).

Si se puede suponer que el árbol binario está equilibrado, seguir cualquier ruta individual desde la raíz hasta un nodo hoja, como lo haría al buscar un valor, debería darle una altura dentro de 1 de la profundidad máxima. Ese sería su caso de complejidad logarítmica.

Si el árbol no está equilibrado, es posible que necesite explorar cada rama para encontrar la altura más grande. Esa sería una operación O (N), ya que estás visitando todos los nodos del árbol.

En el peor de los casos, tendría que verificar cada nodo del árbol binario con un tamaño de N. Pronto).

El caso degenerado (peor) para un árbol binario simple es una lista vinculada. Entonces, su peor caso es O (n).