

En informática , un árbol AVL (llamado así por sus inventores Adelson - Velsky y Landis ) es un árbol de búsqueda binaria autoequilibrado . En un árbol AVL, las alturas de los dos subárboles hijos de cualquier nodo difieren en no más de uno; si en algún momento difieren en más de uno, se realiza un reequilibrio para restaurar esta propiedad. La búsqueda, la inserción y la eliminación toman un tiempo de O (log n ) tanto en el caso promedio como en el peor de los casos, dondees el número de nodos en el árbol antes de la operación. Las inserciones y eliminaciones pueden requerir que el árbol se reequilibre mediante una o más rotaciones del árbol .
El árbol AVL recibe su nombre de sus dos inventores soviéticos , Georgy Adelson-Velsky y Evgenii Landis , quienes lo publicaron en su artículo de 1962 titulado "Un algoritmo para la organización de la información". [ 2 ] Es la primera estructura de datos de árbol de búsqueda binaria autoequilibrada que se inventó. [ 3 ]
Los árboles AVL se comparan a menudo con los árboles rojo-negro porque ambos admiten el mismo conjunto de operaciones y tomantiempo para las operaciones básicas. Para aplicaciones con uso intensivo de búsquedas, los árboles AVL son más rápidos que los árboles rojo-negro porque están más estrictamente equilibrados. [ 4 ] De forma similar a los árboles rojo-negro, los árboles AVL están equilibrados en altura. En general, ambos no están ni equilibrados en peso ni-equilibrado para cualquier; [ 5 ] es decir, los nodos hermanos pueden tener números de descendientes enormemente diferentes.
Definición
Factor de equilibrio
En un árbol binario , el factor de equilibrio de un nodo X se define como la diferencia de altura.
- [ 6 ] : 459
de sus dos subárboles hijos enraizados por el nodo X.
Un árbol binario se define como un árbol AVL si
se cumple para cada nodo X en el árbol.
Un nodo X conse llama "de izquierda a derecha", uno conse llama "pesado hacia la derecha" y uno conA veces se le llama simplemente "equilibrado".
Propiedades
Los factores de equilibrio se pueden mantener actualizados conociendo los factores de equilibrio anteriores y el cambio de altura; no es necesario conocer la altura absoluta. Para almacenar la información de equilibrio AVL, dos bits por nodo son suficientes. [ 7 ]
La altura(contado como el número máximo de niveles) de un árbol AVL conLos nodos se encuentran en el intervalo: [ 6 ] : 460
dónde :={\tfrac {1+{\sqrt {5}}}{2}}\approx 1.618} es la proporción áurea y Esto se debe a que un árbol AVL de alturacontiene al menosnodos dondees la secuencia de Fibonacci con los valores semilla
Operaciones
Las operaciones de solo lectura de un árbol AVL implican llevar a cabo las mismas acciones que se realizarían en un árbol de búsqueda binaria desequilibrado , pero las modificaciones deben respetar y restablecer el equilibrio de altura de los subárboles.
Búsqueda
La búsqueda de una clave específica en un árbol AVL se puede realizar de la misma manera que en cualquier árbol de búsqueda binaria balanceado o desbalanceado . [ 8 ] : cap. 8 Para que la búsqueda funcione eficazmente, debe emplear una función de comparación que establezca un orden total (o al menos un preorden total ) en el conjunto de claves. [ 9 ] : 23 El número de comparaciones necesarias para una búsqueda exitosa está limitado por la altura h y para una búsqueda fallida es muy cercano a h , por lo que ambas están en O(log n ) , donde n es el número de nodos en el árbol. [ 10 ] : 216
Recorrido
Como operación de solo lectura, el recorrido de un árbol AVL funciona de la misma manera que en cualquier otro árbol binario. Al explorar los n nodos del árbol, cada enlace se visita exactamente dos veces: una visita hacia abajo para entrar en el subárbol enraizado por ese nodo y otra visita hacia arriba para salir del subárbol de ese nodo después de haberlo explorado.
Una vez que se ha encontrado un nodo en un árbol AVL, se puede acceder al nodo siguiente o anterior en tiempo constante amortizado . [ 11 ] : 58 Algunos casos de exploración de estos nodos "cercanos" requieren recorrer hasta h ∝ log( n ) enlaces (particularmente cuando se navega desde la hoja más a la derecha del subárbol izquierdo de la raíz hasta la raíz o desde la raíz hasta la hoja más a la izquierda del subárbol derecho de la raíz; en el árbol AVL de la figura 1, navegar desde el nodo P hasta el siguiente nodo a la derecha Q toma 3 pasos). Dado que hay n −1 enlaces en cualquier árbol, el costo amortizado es 2×( n −1)/ n , o aproximadamente 2.
Insertar
Al insertar un nodo en un árbol AVL, se sigue inicialmente el mismo proceso que al insertarlo en un árbol de búsqueda binaria . Si el árbol está vacío, el nodo se inserta como raíz. Si el árbol no está vacío, se recorre el árbol desde la raíz y, recursivamente, se busca la ubicación para insertar el nuevo nodo. Este recorrido se guía por la función de comparación. En este caso, el nodo siempre reemplaza una referencia nula (izquierda o derecha) de un nodo externo en el árbol; es decir, el nodo se convierte en hijo izquierdo o derecho del nodo externo.
Tras esta inserción, si un árbol se desequilibra, solo los ancestros del nodo recién insertado se desequilibran. Esto se debe a que solo esos nodos ven alterados sus subárboles. [ 12 ] Por lo tanto, es necesario comprobar la coherencia de cada uno de los ancestros del nodo con las invariantes de los árboles AVL: esto se denomina "retroceso". Esto se logra considerando el factor de equilibrio de cada nodo. [ 6 ] : 458–481 [ 11 ] : 108
Dado que con una sola inserción la altura de un subárbol AVL no puede aumentar en más de uno, el factor de equilibrio temporal de un nodo después de una inserción estará en el rango [–2,+2]. Para cada nodo verificado, si el factor de equilibrio temporal permanece en el rango de –1 a +1 entonces solo es necesaria una actualización del factor de equilibrio y no una rotación. Sin embargo, si el factor de equilibrio temporal es ±2, el subárbol enraizado en este nodo está AVL desequilibrado y se necesita una rotación. [ 9 ] : 52 Con la inserción como muestra el código a continuación, la rotación adecuada reequilibra inmediatamente el árbol perfectamente .
En la figura 1, al insertar el nuevo nodo Z como hijo del nodo X, la altura de ese subárbol Z aumenta de 0 a 1.
- Invariante del bucle de retroceso para una inserción
La altura del subárbol enraizado por Z ha aumentado en 1. Ya tiene forma AVL.
Para actualizar los factores de equilibrio de todos los nodos, primero observe que todos los nodos que requieren corrección se encuentran en la ruta de la hoja insertada, desde el nodo hijo hasta el nodo padre. Si se aplica el procedimiento anterior a los nodos a lo largo de esta ruta, comenzando desde la hoja, entonces cada nodo del árbol volverá a tener un factor de equilibrio de -1, 0 o 1.
El rastreo puede detenerse si el factor de equilibrio se vuelve 0, lo que implica que la altura de ese subárbol permanece sin cambios.
Si el factor de equilibrio se convierte en ±1, la altura del subárbol aumenta en uno y es necesario continuar con el rastreo.
Si el factor de equilibrio se convierte temporalmente en ±2, esto debe corregirse mediante una rotación adecuada, tras la cual el subárbol tendrá la misma altura que antes (y su raíz el factor de equilibrio 0).
El tiempo requerido es O(log n ) para la búsqueda, más un máximo de O(log n ) niveles de retroceso ( O(1) en promedio) en el camino de regreso a la raíz, por lo que la operación puede completarse en un tiempo de O(log n ) . [ 9 ] : 53
Borrar
Los pasos preliminares para eliminar un nodo son los mismos que para un árbol de búsqueda binaria . En este caso, la eliminación efectiva del nodo en cuestión o del nodo de reemplazo reduce la altura del árbol hijo correspondiente de 1 a 0 o de 2 a 1, si dicho nodo tenía un hijo.
A partir de este subárbol, es necesario comprobar la coherencia de cada uno de los ancestros con las invariantes de los árboles AVL. Esto se denomina "recorrido".
Dado que con una sola eliminación la altura de un subárbol AVL no puede disminuir en más de uno, el factor de equilibrio temporal de un nodo estará en el rango de −2 a +2. Si el factor de equilibrio permanece en el rango de −1 a +1, se puede ajustar de acuerdo con las reglas AVL. Si se convierte en ±2, entonces el subárbol está desequilibrado y necesita ser rotado. (A diferencia de la inserción, donde una rotación siempre equilibra el árbol, después de la eliminación, puede haber BF(Z) ≠ 0 (ver figuras 2 y 3), de modo que después de la rotación simple o doble apropiada la altura del subárbol reequilibrado disminuye en uno, lo que significa que el árbol debe ser reequilibrado nuevamente en el siguiente nivel superior). Los diversos casos de rotaciones se describen en la sección Reequilibrio .
- Invariante del bucle de retroceso para una eliminación
La altura del subárbol enraizado por N ha disminuido en 1. Ya tiene forma AVL.
El rastreo puede detenerse si el factor de equilibrio se convierte en ±1 (debe haber sido 0), lo que significa que la altura de ese subárbol permanece sin cambios.
Si el factor de equilibrio se convierte en 0 (debe haber sido ±1), entonces la altura del subárbol disminuye en uno y el rastreo debe continuar.
Si el factor de equilibrio se convierte temporalmente en ±2, esto debe corregirse mediante una rotación adecuada. Dependiendo del factor de equilibrio del nodo hermano Z (el árbol hijo superior en la figura 2), la altura del subárbol disminuye en uno —y el retroceso debe continuar— o no cambia (si Z tiene un factor de equilibrio de 0) y todo el árbol tiene forma AVL.
El tiempo requerido es O(log n ) para la búsqueda, más un máximo de O(log n ) niveles de retroceso ( O(1) en promedio) en el camino de regreso a la raíz, por lo que la operación se puede completar en un tiempo O(log n ) .
Operaciones de configuración y operaciones a granel
Además de las operaciones de inserción, eliminación y búsqueda de elementos individuales, se han definido varias operaciones de conjuntos en árboles AVL: unión , intersección y diferencia de conjuntos . A partir de estas funciones de conjuntos, se pueden implementar operaciones masivas rápidas de inserción o eliminación. Estas operaciones de conjuntos se basan en dos operaciones auxiliares: Split y Join . Con las nuevas operaciones, la implementación de árboles AVL puede ser más eficiente y altamente paralelizable. [ 13 ]
La función Join, aplicada a dos árboles AVL t 1 y t 2 y una clave k, devuelve un árbol que contiene todos los elementos de t 1 , t 2 y k . Requiere que k sea mayor que todas las claves de t 1 y menor que todas las claves de t 2. Si la altura de los dos árboles difiere como máximo en uno, Join simplemente crea un nuevo nodo con el subárbol izquierdo t 1 , la raíz k y el subárbol derecho t 2. En caso contrario, supongamos que t 1 es mayor que t 2 en más de uno (el otro caso es simétrico). Join sigue la columna vertebral derecha de t 1 hasta un nodo c que está equilibrado con t 2. En este punto, se crea un nuevo nodo con el hijo izquierdo c , la raíz k y el hijo derecho t 2 para reemplazar a c. El nuevo nodo satisface la invariante AVL y su altura es una unidad mayor que la de c . El aumento de altura puede incrementar la altura de sus ancestros, posiblemente invalidando la invariante AVL de esos nodos. Esto se puede solucionar con una doble rotación si el nodo padre no es válido, o con una rotación simple a la izquierda si el nodo padre no es válido en un nivel superior del árbol. En ambos casos, se restablece la altura para los nodos ancestros posteriores. Por lo tanto, la operación de unión requerirá como máximo dos rotaciones. El coste de esta función es la diferencia de alturas entre los dos árboles de entrada.
Para dividir un árbol AVL en dos árboles más pequeños, uno con valores menores que la clave k y otro con valores mayores que la clave k , primero se traza un camino desde la raíz insertando k en el AVL. Tras esta inserción, todos los valores menores que k se encontrarán a la izquierda del camino, y todos los valores mayores que k se encontrarán a la derecha. Al aplicar la operación Join , todos los subárboles del lado izquierdo se fusionan de abajo hacia arriba utilizando las claves del camino como nodos intermedios para formar el árbol izquierdo, mientras que la parte derecha es asimétrica. El coste de Split es O(log n ) , del orden de la altura del árbol.
La unión de dos árboles AVL t 1 y t 2 que representan conjuntos A y B , es un AVL t que representa A ∪ B.
El algoritmo para la intersección o la diferencia es similar, pero requiere la rutina auxiliar Join2 , que es igual a Join pero sin la clave central. Basándose en las nuevas funciones de unión, intersección o diferencia, se puede insertar o eliminar una o varias claves del árbol AVL. Dado que Split llama a Join pero no maneja directamente los criterios de balanceo de los árboles AVL, esta implementación se suele denominar implementación "basada en unión" .
La complejidad de cada uno de la unión, la intersección y la diferencia espara árboles AVL de tamañosyMás importante aún, dado que las llamadas recursivas a la unión, la intersección o la diferencia son independientes entre sí, pueden ejecutarse en paralelo con una profundidad paralela .. [ 13 ] CuandoLa implementación basada en uniones tiene el mismo DAG computacional que la inserción y eliminación de un solo elemento.
Reequilibrio
Si durante una operación de modificación cambia la diferencia de altura entre dos subárboles hijos, esto puede reflejarse, siempre que sea < 2, en una adaptación de la información de equilibrio en el padre. Durante las operaciones de inserción y eliminación puede surgir una diferencia de altura (temporal) de 2, lo que significa que el subárbol padre debe ser "reequilibrado". Las herramientas de reparación dadas son las llamadas rotaciones de árbol , porque mueven las claves solo "verticalmente", de modo que la secuencia en orden ("horizontal") de las claves se conserva completamente (lo cual es esencial para un árbol de búsqueda binaria). [ 6 ] : 458–481 [ 11 ] : 33
Let X be the node that has a (temporary) balance factor of −2 or +2. Its left or right subtree was modified. Let Z be the child with the higher subtree (see figures 2 and 3). Note that both children are in AVL shape by induction hypothesis.
In case of insertion this insertion has happened to one of Z's children in a way that Z's height has increased. In case of deletion this deletion has happened to the sibling t1 of Z in a way so that t1's height being already lower has decreased. (This is the only case where Z's balance factor may also be 0.)
There are four possible variants of the violation:
And the rebalancing is performed differently:
Thereby, the situations are denoted as C B, where C (= child direction) and B (= balance) come from the set { Left, Right} with Right := −Left. The balance violation of case C == B is repaired by a simple rotation rotate_(−C), whereas the case C != B is repaired by a double rotation rotate_CB.
The cost of a rotation, either simple or double, is constant.
Simple rotation
Figure 2 shows a Right Right situation. In its upper half, node X has two child trees with a balance factor of +2. Moreover, the inner child t23 of Z (i.e., left child when Z is right child, or right child when Z is left child) is not higher than its sibling t4. This can happen by a height increase of subtree t4 or by a height decrease of subtree t1. In the latter case, also the pale situation where t23 has the same height as t4 may occur.
The result of the left rotation is shown in the lower half of the figure. Three links (thick edges in figure 2) and two balance factors are to be updated.
Como muestra la figura, antes de una inserción, la capa de hojas se encontraba en el nivel h+1, temporalmente en el nivel h+2 y, tras la rotación, de nuevo en el nivel h+1. En caso de eliminación, la capa de hojas se encontraba en el nivel h+2, donde vuelve a estar cuando t 23 y t 4 tenían la misma altura. De lo contrario, la capa de hojas alcanza el nivel h+1, por lo que la altura del árbol rotado disminuye.

- Fragmento de código para una rotación simple a la izquierda.
nodo * rotar_a_izquierda ( nodo * X , nodo * Z ) {// Z es 2 unidades mayor que su hermanot23 = left_child ( Z ); // Hijo interno de Zhijo_derecho ( X ) = t23 ;si ( t23 != null )padre ( t23 ) = X ;hijo_izquierdo ( Z ) = X ;padre ( X ) = Z ;// 1er caso, BF(Z) == 0,// Esto solo ocurre con la eliminación, no con la inserción:if ( BF ( Z ) == 0 ) { // t23 ha tenido la misma altura que t4BF ( X ) = + 1 ; // t23 ahora es mayorBF ( Z ) = – 1 ; // t4 ahora es menor que X} demás{ // El segundo caso ocurre con la inserción o eliminación:BF ( X ) = 0 ;BF ( Z ) = 0 ;}return Z ; // devuelve la nueva raíz del subárbol rotado}Doble rotación
La figura 3 muestra una situación de derecha a izquierda. En su tercio superior, el nodo X tiene dos árboles hijos con un factor de equilibrio de +2 . Pero a diferencia de la figura 2, el hijo interno Y de Z es más alto que su hermano t4 . Esto puede ocurrir por la inserción del propio Y o por un aumento de altura de uno de sus subárboles t2 o t3 ( con la consecuencia de que tengan diferente altura) o por una disminución de altura del subárbol t1 . En este último caso, también puede ocurrir que t2 y t3 tengan la misma altura.
El resultado de la primera rotación, la derecha, se muestra en el tercio central de la figura. (Con respecto a los factores de equilibrio, esta rotación no es del mismo tipo que las demás rotaciones simples de AVL, ya que la diferencia de altura entre Y y t 4 es solo 1). El resultado de la rotación final izquierda se muestra en el tercio inferior de la figura. Se deben actualizar cinco eslabones (bordes gruesos en la figura 3) y tres factores de equilibrio.
Como muestra la figura, antes de una inserción, la capa de hojas estaba en el nivel h+1, temporalmente en el nivel h+2 y después de la doble rotación nuevamente en el nivel h+1. En caso de una eliminación, la capa de hojas estaba en el nivel h+2 y después de la doble rotación está en el nivel h+1, por lo que la altura del árbol rotado disminuye.

- Fragmento de código de una doble rotación derecha-izquierda
nodo * rotar_derechaIzquierda ( nodo * X , nodo * Z ) {// Z es 2 unidades mayor que su hermanoY = left_child ( Z ); // Hijo interno de Z// Y es 1 unidad mayor que su hermano/at3 = hijo_derecho ( Y );left_child ( Z ) = t3 ;si ( t3 != null )padre ( t3 ) = Z ;hijo_derecho ( Y ) = Z ;padre ( Z ) = Y ;t2 = left_child ( Y );hijo_derecho ( X ) = t2 ;si ( t2 != null )padre ( t2 ) = X ;hijo_izquierdo ( Y ) = X ;padre ( X ) = Y ;// Primer caso, BF(Y) == 0si ( BF ( Y ) == 0 ) {BF ( X ) = 0 ;BF ( Z ) = 0 ;} else if ( BF ( Y ) > 0 ) {// t3 fue más altoBF ( X ) = – 1 ; // t1 ahora es mayorBF ( Z ) = 0 ;} demás {// t2 fue mayorBF ( X ) = 0 ;BF ( Z ) = + 1 ; // t4 ahora es mayor}BF ( Y ) = 0 ;return Y ; // devuelve la nueva raíz del subárbol rotado}Comparación con otras estructuras
Tanto los árboles AVL como los árboles rojo-negro (RB) son árboles de búsqueda binaria autoequilibrados y están relacionados matemáticamente. De hecho, todo árbol AVL puede ser coloreado de rojo-negro, [ 14 ] pero hay árboles RB que no están equilibrados AVL. Para mantener los invariantes del árbol AVL (o RB), las rotaciones juegan un papel importante. En el peor de los casos, incluso sin rotaciones, las inserciones o eliminaciones AVL o RB requieren O(log n ) inspecciones y/o actualizaciones de los factores de equilibrio AVL (o colores RB). Las inserciones y eliminaciones RB y las inserciones AVL requieren de cero a tres rotaciones recursivas de cola y se ejecutan en un tiempo amortizado O(1) , [ 15 ] : pp.165, 158 [ 16 ] por lo tanto, igualmente constante en promedio. Las eliminaciones AVL que requieren O(log n ) rotaciones en el peor de los casos también son O(1) en promedio. Los árboles RB requieren almacenar un bit de información (el color) en cada nodo, mientras que los árboles AVL suelen usar dos bits para el factor de equilibrio, aunque, cuando se almacena en los hijos, basta con un bit con el significado de «menor que el hermano». La mayor diferencia entre ambas estructuras de datos radica en su límite de altura.
Para un árbol de tamaño n ≥ 1
- La altura de un árbol AVL es como máximo
- dónde :={\tfrac {1+{\sqrt {5}}}{2}}\approx 1.618} la proporción áurea , y .
- La altura de un árbol RB es como máximo
- . [ 17 ]
Los árboles AVL están más rígidamente equilibrados que los árboles RB, con una relación asintótica AVL/RB ≈ 0,720 de las alturas máximas. Para inserciones y deleciones, Ben Pfaff muestra en 79 mediciones una relación AVL/RB entre 0,677 y 1,077 con una mediana ≈ 0,947 y una media geométrica ≈ 0,910. [ 4 ]
Véase también
Referencias
- 1 2 3 4 5 6 Eric Alexander. "Árboles AVL" . Archivado del original el 31 de julio de 2019.
- ↑ Adelson-Velsky, Georgy; Landis, Evgenii (1962). "Un algoritmo para la organización de la información". Actas de la Academia de Ciencias de la URSS (en ruso). 146 : 263–266 .Traducción al inglés de Myron J. Ricci en Soviet Mathematics - Doklady , 3:1259–1263, 1962.
- ↑ Sedgewick, Robert (1983). "Árboles equilibrados" . Algoritmos . Addison-Wesley. pág . 199. ISBN 0-201-06672-6.
- 1 2 Pfaff, Ben (junio de 2004). "Análisis de rendimiento de BST en software de sistema" (PDF) . Universidad de Stanford .
- ↑ ¿ Los árboles AVL no están equilibrados en peso? (es decir: ¿los árboles AVL no están μ-equilibrados?) Por lo tanto: Un árbol binario se llama-equilibrado, con, si para cada nodola desigualdad
- 1 2 3 4 Knuth, Donald E. (2000). Clasificación y búsqueda (2.ª ed., 6.ª reimpresión, edición actualizada y revisada ). Boston [ua]: Addison-Wesley. ISBN 0-201-89685-0.
- ↑ Sin embargo, la información de equilibrio se puede mantener en los nodos hijos como un bit que indica si el padre es mayor en 1 o en 2; por lo tanto, no puede ocurrir que ambos hijos sean mayores en 2. De esta manera, el árbol AVL es un árbol "equilibrado en rango" , como lo denominaron Haeupler, Sen y Tarjan .
- ↑ Dixit, JB (2010). Dominando las estructuras de datos mediante el lenguaje 'C' . Nueva Delhi, India: University Science Press, un sello editorial de Laxmi Publications Pvt. Ltd. ISBN 9789380386720OCLC 939446542
- 1 2 3 Brass, Peter (2008). Estructuras de datos avanzadas . Cambridge: Cambridge University Press. ISBN 9780511438202OCLC 312435417
- ↑ Hubbard, John Rast (2000). Schaum's outline of theory and problems of data structures with Java . Nueva York: McGraw-Hill. ISBN 0071378707OCLC 48139308
- 1 2 3 Pfaff, Ben (2004). Una introducción a los árboles de búsqueda binaria y los árboles equilibrados . Free Software Foundation, Inc.
- ↑ Weiss, Mark Allen (2006). Estructuras de datos y análisis de algoritmos en C++ (3.ª ed.). Boston: Pearson Addison-Wesley. pág. 145. ISBN 0-321-37531-9OCLC 61278554
- 1 2 Blelloch, Guy E.; Ferizovic, Daniel; Sun, Yihan (2016), "Just join for parallel ordered sets", Symposium on Parallel Algorithms and Architectures , ACM, pp. 253– 264, arXiv : 1602.02120 , doi : 10.1145/2935764.2935768 , ISBN 978-1-4503-4210-0, S2CID 2897793 .
- ↑ Paul E. Black (13 de abril de 2015). "Árbol AVL" . Diccionario de algoritmos y estructuras de datos . Instituto Nacional de Estándares y Tecnología . Consultado el 2 de julio de 2016 .
- ↑ Mehlhorn, Kurt; Sanders, Peter (2008). Algoritmos y estructuras de datos . Berlín, Heidelberg: Springer Berlin Heidelberg. doi : 10.1007/978-3-540-77978-0 . ISBN 978-3-540-77977-3.
- ↑ Dinesh P. Mehta; Sartaj Sahni, eds. (15 de diciembre de 2017). Manual de estructuras de datos y aplicaciones (2.ª ed.). Nueva York: Chapman and Hall/CRC. doi : 10.1201/9781315119335 . ISBN 978-1-315-11933-5.
- ↑ Árbol rojo-negro#Prueba de límites
Lecturas adicionales
- Donald Knuth . El arte de la programación informática , Volumen 3: Ordenación y búsqueda , Tercera edición. Addison-Wesley, 1997. ISBN 0-201-89685-0Páginas 458–475 de la sección 6.2.3: Árboles equilibrados.
- Haeupler, Bernhard; Sen, Siddhartha; Tarjan, Robert E. (2015), "Árboles equilibrados por rango" (PDF) , ACM Transactions on Algorithms , 11 (4): Art. 30, 26, doi : 10.1145/2689412 , MR 3361215 , S2CID 1407290 .
Enlaces externos
Este artículo incorpora material de dominio público de Paul E. Black. "Árbol AVL" . Diccionario de algoritmos y estructuras de datos . NIST .
- 1962 en informática
- Árboles binarios
- Inventos soviéticos
- Buscar árboles
- Estructuras de datos amortizadas