Árboles AVL M.C. Meliza Contreras González ¿Qué es un árbol AVL? • Es un árbol binario de búsqueda al que se le añade una condición de equilibrio. • Esta condición es que para todo nodo la altura de sus subárboles izquierdo y derecho pueden diferir a lo sumo en una unidad. • Propuesto en 1962 por Adelson-Velskii y Landis. 2 Ejemplos de árboles AVL no no 3 Factor de balanceo • Los nodos de un árbol AVL guardan un valor entre 1 y -1, lo que se conoce como Factor de Balanceo(FB) y representa la diferencia entre las alturas de sus subárboles. • FB= 0 las alturas son iguales 1 altura del derecho> izquierdo -1 altura del izquierdo> derecho 4 Factor de balanceo de árboles AVL 0 - + - 0 0 0 0 + 0 + 0 0 0 0 5 Inserción de un nodo en un árbol AVL • La inserción es idéntica que en un árbol binario de búsqueda. • Una vez realizada la inserción si el árbol se desbalancea se realizan: – Determinación del nodo pivote: nodo con FB distinto de 0 más cercano a los ancestros del nodo insertado – Rotaciones simples – Rotaciones dobles 6 Casos de balanceo después de la inserción 1. El árbol AVL carece de nodo pivote: significa que en todos los ancestros del nuevo nodo tienen FB=0, al insertar el nodo, el árbol no se desbalancea, sólo se ajustan los valores de FB de todos los ancestros. 0 + 0 0 0 0 0 Nuevo nodo 0 0 0 0 + 0 Nuevo nodo 7 Casos de balanceo después de la inserción 2. El árbol AVL tiene nodo pivote y el nuevo nodo se inserto en el subárbol más pequeño del pivote: en este caso se igualan las alturas de los dos subárboles y no ocurre desbalanceo, sólo se ajustan los valores de FB de todos los ancestros. + Nodo pivote - 0 0 0 + 0 0 Nodo pivote 0 0 0 0 + + 0 Nuevo nodo 8 Casos de balanceo después de la inserción 3. El árbol AVL tiene nodo pivote y el nuevo nodo se inserto en el subárbol más grande del pivote: en este caso se desbalancea el árbol a partir del pivote y hay que ocupar rotaciones. 9 Rotación simple izquierda Resto del árbol + Resto del árbol pivote B A 0 0 0 A B 3 1 2 Los triángulos pueden ser nulos 3 1 2 Nuevo nodo Nuevo nodo 10 Rotación simple derecha Resto del árbol - B Resto del árbol pivote A 0 0 0 A B 1 3 3 2 2 1 Nuevo nodo Nuevo nodo Los triángulos pueden ser nulos 11 Rotación doble izquierda Resto del árbol Resto del árbol + B C 0 pivote 0 A 0,- 0,+ A B 0 C 1 2 2 3 1 4 Los triángulos pueden ser nulos. Nuevo nodo 3 El nodo C puede ser el nodo a insertar 4 Nuevo nodo 12 Rotación doble derecha Resto del árbol Resto del árbol - B C 0 pivote 0,- 0 A 0,+ B A 0 C 1 4 3 2 3 4 1 Los triángulos pueden ser nulos. El nodo C puede ser el nodo a insertar Nuevo nodo 2 Nuevo nodo 13 Ejemplos 1. Antes de insertar hay que checar que sea un árbol AVL 2. Identificar los casos dependiendo si tiene pivote o no y en que subárbol se va a insertar. 3. Si se desbalancea hay que revisar que rotaciones aplicar 0 0 12 0 - 7 pivote - 4 0 2 21 - 0 0 0 9 16 25 4 0 0 8 13 0 19 Insertar el nodo 5 12 0 0 2 7 21 - 0 9 0 5 0 8 - 25 16 0 13 0 0 19 Caso 2: tiene pivote (nodo 4) y se inserta en el subárbol más pequeño y se actualizan los factores de balanceo de los ancestros 14 Insertar el nodo 26 0 0 12 0 - 7 - 4 0 2 0 21 - 0 0 9 16 25 0 0 8 13 0 19 12 pivote 0 7 - 4 0 2 21 - 0 + 9 16 25 0 0 8 13 0 0 19 26 Caso 2: tiene pivote (nodo 21) y se inserta en el subárbol más pequeño, en este caso no hay subárboles cuyo nodo padre sea 25 y se actualizan los factores de balanceo de los ancestros 15 Insertar el nodo 23 0 0 12 0 7 - 4 0 2 0 9 16 0 0 8 13 0 7 21 - 12 0 0 - + pivote 4 25 0 0 19 26 0 2 21 - 0 9 16 0 0 8 13 0 25 0 0 0 19 23 26 Caso 2: tiene pivote (nodo 25) y se inserta en el subárbol más pequeño y se actualizan los factores de balanceo de los ancestros 16 Insertar el nodo 27 + 0 12 0 7 - 4 0 2 0 9 16 0 0 8 13 0 + 7 21 - 12 0 0 0 - 25 4 0 19 23 26 0 0 2 21 - 0 9 16 0 0 8 13 + 25 0 0 + 19 23 26 0 27 Caso 1: no tiene pivote y se inserta como hijo derecho del nodo padre que es 26, se actualizan los factores de balanceo de los ancestros 17 Insertar el nodo 28 (rotación simple izquierda) + + 0 + 7 - 4 0 2 0 25 0 8 13 0 19 - 4 + 16 0 21 - 0 9 + 7 21 - 12 0 12 9 0 2 + + 0 25 16 0 0 8 13 0 0 19 23 26 pivote 23 + pivote 26 0 27 0 27 28 Caso 3: tiene pivote (nodo 26) y se desbalancea el árbol a partir del mismo, por lo que se requiere una rotación (izquierda porque el pivote es +) . + + 12 0 7 - 4 0 2 + 0 9 0 8 13 - 0 19 0 23 B+ 26 A0 1 27 2 En este caso los triángulos 1,2,3 son nulos. 3 28 0 2 21 - 4 25 16 0 + 7 21 - 12 0 + + 0 9 25 16 0 0 8 13 0 19 0 23 A0 27 0 El nodo 28 es el hijo derecho del nodo 27 B 26 dado que el triángulo 3 es nulo, es decir el nodo A en la rotación se vuelve el nodo padre de B y del nodo a insertar ver rotación simple izquierda 3 28 0 1 2 18 Insertar el nodo 0 (rotación simple derecha) 0 0 12 0 - 7 21 - - pivote 4 0 0 8 13 2 25 16 0 pivote 0 0 9 12 0 7 21 - - 4 0 2 0 0 9 0 19 - 25 16 0 0 8 13 0 19 0 Caso 3: tiene pivote (nodo 4) y se desbalancea el árbol a partir del mismo, por lo que se requiere una rotación (derecha porque el pivote es -) . 0 0 12 0 - 7 B - 4 A 0 1 3 0 25 16 0 13 0 19 2 0 En este caso los triángulos 1,2,3 son nulos. 21 - 2 0 - 7 0 A 0 0 9 8 2 21 - 12 0 3 0 0 B 4 2 1 0 0 9 25 16 0 0 8 13 0 19 El nodo 0 es el hijo izquierdo del nodo 2 dado que el triángulo 3 es nulo, es decir el nodo A en la rotación se vuelve el nodo padre de B y del nodo a insertar ver rotación simple derecha 19 Insertar el nodo 8 (rotación doble derecha) - 50 - - - 30 70 30 70 - + 15 40 - pivote 0 20 7 - 18 0 + - 10 50 - 35 42 0 0 25 37 + + 55 80 0 0 15 0 pivote 52 60 0 58 90 40 - 20 0 0 - 66 7 18 0 + - 10 0 17 - + 35 42 0 0 25 37 + + 55 80 0 0 52 0 60 0 58 90 0 66 0 8 17 Caso 3: tiene pivote (nodo 10) y se desbalancea el árbol a partir del mismo, por lo que se requiere una rotación (derecha porque el pivote es -) . 20 Insertar el nodo 8 (segunda parte) (rotación doble derecha) - 50 - - - 30 70 30 70 - + 15 B 40 - A 20 0 - 0 + - 10 50 - 35 42 0 0 25 37 + + 55 80 0 0 52 0 15 0 60 C 90 18 C 4 0 8 3 58 17 40 0 0 A 66 7 4 0 20 B 0 - 18 10 3 2 1 0 + - 8 1 7 - + 35 42 0 0 25 37 + + 55 80 0 52 0 58 0 0 60 90 0 66 0 17 2 En este caso los triángulos 1,2,3,4 son nulos, y el nodo C es el nodo a insertar. El nodo C en la rotación doble es el padre de A y B, ver rotación doble derecha 21 Insertar el nodo 36 (rotación doble izquierda) - 50 - - - 30 70 30 70 - + 15 40 pivote - 0 20 7 - 18 0 17 0 + - 10 50 - 35 42 0 0 25 37 + + 55 80 0 0 52 0 58 15 40 pivote 0 60 - + - 90 20 10 0 0 - 66 7 18 0 + - 35 42 0 0 25 37 + + 55 80 0 0 52 0 60 0 58 90 0 66 0 17 36 Caso 3: tiene pivote (nodo 35) y se desbalancea el árbol a partir del mismo, por lo que se requiere una rotación (izquierda porque el pivote es +) . 22 Insertar el nodo 36 (segunda parte) (rotación doble izquierda) - 50 - - - 30 70 30 70 - + 15 40 B - - 0 - 7 18 0 + 20 10 50 - 42 35 0 0 1 25 A 37 0 C 17 + + 55 80 15 0 0 52 - 60 90 58 10 0 0 - 66 7 18 0 4 36 2 + 0 - + + 40 55 80 - C 0 20 36 0 0 42 0 B 0 25 35 1 2 52 60 0 A 37 3 0 0 58 90 0 66 4 17 3 En este caso los triángulos 1,2,3,4 son nulos, y el nodo C es el nodo a insertar. El nodo C en la rotación doble es el padre de A y B, ver rotación doble izquierda 23