Un árbol de chivo expiatorio posiblemente tiene el algoritmo de determinación del equilibrio más simple de entender. Si alguna inserción hace que el nuevo nodo sea demasiado profundo, encuentra un nodo alrededor del cual reequilibrar, observando el equilibrio de peso en lugar del equilibrio de altura. La regla de si reequilibrar o eliminar también es simple. No almacena ninguna información arcana en los nodos. Es más complicado probar que es correcto, pero no es necesario para entender el algoritmo ...
Sin embargo, a diferencia de una AVL, no tiene un equilibrio de altura en todo momento. Al igual que el rojo-negro, su desequilibrio está limitado, pero a diferencia del rojo-negro, se puede ajustar con un parámetro, por lo que para la mayoría de los propósitos prácticos se ve tan equilibrado como se necesita. Sospecho que si lo sintonizas demasiado fuerte, terminará igual o peor que AVL para las inserciones del peor caso.
Respuesta a la pregunta de edición
voy a ofrecer mi camino personal hacia la comprensión de árboles AVL.
Primero tienes que entender qué es la rotación de un árbol, así que ignora todo lo demás que hayas escuchado sobre los algoritmos AVL y entiéndelo. Póngase recto en su cabeza, que es una rotación a la derecha y que es una rotación a la izquierda, y lo que cada uno le hace al árbol, o las descripciones de los métodos precisos lo confundirán.
A continuación, comprenda que el truco para equilibrar árboles AVL es que cada nodo registra en él la diferencia entre la altura de sus subárboles izquierdo y derecho. La definición de 'altura equilibrada' es que está entre -1 y 1 inclusive para cada nodo en el árbol.
A continuación, tenga en cuenta que si ha agregado o eliminado un nodo, es posible que haya desequilibrado el árbol. Pero solo puede haber cambiado el equilibrio de nodos que son ancestros del nodo que agregó o eliminó. Entonces, lo que vas a hacer es volver a trabajar en el árbol, usando rotaciones para equilibrar los nodos desequilibrados que encuentres y actualizar su puntaje de equilibrio, hasta que el árbol vuelva a estar equilibrado.
La parte final de entender es buscar en una referencia decente las rotaciones específicas usadas para reequilibrar cada nodo que encuentre: esta es la "técnica" de la misma en comparación con el concepto alto. Solo debe recordar los detalles al modificar el código de árbol AVL o quizás durante los exámenes de estructuras de datos. Han pasado muchos años desde la última vez que tuve código de árbol AVL hasta abrirlo en el depurador: las implementaciones tienden a llegar a un punto en el que funcionan y luego siguen funcionando. Entonces realmente no recuerdo. Puedes resolverlo en una mesa usando algunas fichas de poker, pero es difícil estar seguro de que realmente tienes todos los casos (no hay muchos). Lo mejor es buscarlo.
Luego está el negocio de traducirlo todo en código.
No creo que mirar los listados de códigos ayude mucho con cualquier etapa excepto la última, así que ignórelas. Incluso en el mejor de los casos, donde el código está escrito claramente, se verá como una descripción de libro de texto del proceso, pero sin los diagramas. En un caso más típico, es un desastre de manipulación de C struct. Así que solo adhiérase a los libros.
¿Desea que el árbol * perfectamente * esté equilibrado? Los algoritmos más comunes garantizan que un árbol esté algo equilibrado. Por ejemplo, los árboles rojo-negros garantizan que la profundidad del nodo de hoja más profundo no sea más del doble de la profundidad del nodo de hoja más superficial –
Además, ¿está buscando un algoritmo toma un árbol y lo equilibra, o uno que equilibra como parte de las operaciones del árbol, como insertar, eliminar, etc. –
deben definirse "perfectamente". Sin embargo, en el contexto de los árboles binarios, la única definición significativa es la de un árbol binario con altura logarítmica, ¿no es así? –