Está en la página 1de 26

Árboles AVL

Ing. Jesús Estrada D. MSc.


Árboles AVL /equilibrado
• Intenta mantener su altura, o el número de
niveles de nodos bajo la raíz tan bajo como
sea posible.
• Imponen restricciones estructurales para
garantizar (o tender a) que su altura sea
logarítmica.
• El equilibrio se consigue realizando
rotaciones al insertar o borrar los elementos.
Árboles AVL
• Los árboles AVL son ABB donde todo nodo cumple la propiedad de
equilibrado AVL:
– La altura del subárbol izquierdo y del derecho no se diferencian en
más de uno.
• Se define factor de equilibrio de un nodo como:
FE(nodo) = altura(derecho) – altura(izquierdo)
• En un árbol AVL el factor de equilibrio de todo nodo es -1, 0 ó +1.
• Tras la inserción o borrado de un elemento, sólo los ascendientes del
nodo pueden sufrir un cambio en su factor de equilibrio, y en todo caso
sólo en una unidad.
• Se añade una etapa donde se recorren los ascendientes. Si alguno está
desequilibrado (+2 o -2) se vuelve a equilibrar mediante operaciones
denominadas rotaciones.
Ejemplo de árbol AVL
Operaciones
• Un árbol AVL es un árbol binario de búsqueda (ABB), ampliado con un
campo que indica el factor de equilibrio de cada nodo.
• Las operaciones de acceso son idénticas a las de un ABB.
• Las operaciones de inserción y borrado se realizan igual que en un
ABB, salvo que se añade una etapa posterior de reequilibrado.
• El reequilibrado recorre los ascendientes del nodo que ha sufrido
modificación, recalculando sus factores de equilibrio y aplicando las
rotaciones adecuadas cuando es necesario.
• El recorrido se detiene al llegar al nodo raíz o cuando el subárbol del
nodo actual no haya sufrido cambios en altura respecto a la situación
anterior a la operación.
• Es necesario controlar el cambio de altura de los subárboles a lo largo
del recorrido.
Rotaciones
• Una rotación es una reestructuración local de un
subárbol que mantiene la propiedad de
ordenación.
Rotaciones
• Tras una operación de inserción o borrado, se recorren los
ascendientes, recalculando sus factores de equilibrio y teniendo en
cuenta el cambio en altura del subárbol.
• Es posible que en el recorrido el factor de equilibrio de algún nodo pasa
a valer +2 ó -2 (desequilibrado).
• En ese caso se aplica una determinada rotación que restablece el
equilibrio del nodo (aunque es posible que cambie la altura del nodo).
• En un árbol AVL se necesitan 2 tipos de rotaciones (simples y dobles),
en un sentido u otro (izquierdas y derechas).
• Teniendo en cuenta los distintos ajustes de factores de equilibrio y
posibles resultados respecto al cambio de altura, existen seis casos a
considerar.
Rotación simple izquierda
• Posibles causas: Borrado en A que decrementa su altura (sin cambiar
la del subárbol x) o inserción en C que incrementa su altura
(incrementando la de los subárboles y, x).
• Tras la rotación el subárbol decrementa en uno su altura.
Rotación simple izquierda
rotacionSimpleIzquierda(Nodo x)
Nodo hijo ← x.izquierdo
x.Izquierdo ← hijo.derecho
hijo.derecho ← x
retorna hijo
Fin
Rotación simple Derecha
• Posibles causas: Borrado en C que decrementa su altura (sin cambiar
la del subárbol x) o inserción en A que incrementa su altura
(incrementando la de los subárboles y, x).
• Tras la rotación el subárbol decrementa en uno su altura.
Rotación simple Derecha
rotacionSimpleDerecha (Nodo x)
Nodo hijo ← x.derecho
x.derecho ← hijo.izquierdo
hijo.izquierdo ← x
retorna hijo
Fin
Rotaciones
Rotación doble Izquierda
• Posibles causas: Borrado en A que decrementa su altura
(sin cambiar la del subárbol x) ó inserción en B ó C que
incrementa su altura y la de los subárboles z, y, x
• Tras la rotación el subárbol decrementa en uno su altura.
Rotación doble Izquierda
rotacionDobleIzquierda (Nodo x)
x.izquierdo←rotacionSimpleDerecha(x.izquierdo)
rotacionSimpleIzquierda(x)
Fin
Rotación doble Derecha
• Posibles causas: Borrado en D que decrementa su altura (sin cambiar
la del subárbol x) ó inserción en B ó C que incrementa su altura y la de
los subárboles z, y, x
• Tras la rotación el subárbol decrementa en uno su altura.
Rotación doble Derecha
rotacionDobleDerecha (Nodo x)
x.derecho←rotacionSimpleIzquierda(x.derecho);
rotacionSimpleDerecha(x);
Fin
Cuándo rotar dependiendo el caso
Simple a la Izquierda
FB(Nodo) = -2 y FB(Nodo.izq)<>1

Simple a la Derecha
FB(Nodo) = 2 y FB(Nodo.der)<>-1

Doble a la Derecha
FB(Nodo) = 2 y FB(Nodo.der)=-1

Doble a la Izquierda
FB(Nodo) = -2 y FB(Nodo.izq)=1
Para el siguiente árbol
La inserción de elementos provoca
• No provoca rotaciones
19, 28, 33, 45, 51, 75 • Doble rotación a la derecha
8
• Rotación a la derecha
100, 65, 68 • Doble rotación a la izquierda
36, 57, 59, 95
• Rotación a la izquierda
5, 16
Para el siguiente árbol
La eliminación de elementos
provoca
• No provoca rotaciones
17, 18, 58, 60, 66 • Doble rotación a la derecha
7, 10
• Rotación a la derecha
52 • Doble rotación a la izquierda
42
• Rotación a la izquierda
25

• La eliminación del 80 provoca rotación doble derecha en el nivel


del nodo 70 y rotación simple a la izquierda en el nodo 50
Algoritmo Árbol AVL
• Insertar
– Agregar elementos como en un árbol binario,
dependiendo de las condiciones > o <
– Al agregar el elemento, se calcula el factor de
balance de cada uno de los nodos ascendentes
al nodo recién agregado.
– Dependiendo de las condiciones definidas para
rotar dependiendo del caso, se ejecuta la
rotación.
Algoritmo Árbol AVL
• Eliminar
– Identificar el nodo a eliminar con la búsqueda en el
árbol binario.
– Al agregar eliminar el elemento, si este tiene 2 hijos,
se reemplaza por el elemento mayor de los
menores, o menor de los mayores. En el caso que
tenga 1 hijo, se reemplaza por el hijo.
– Se calcula el factor de balance de cada nodos
ascendente al nodo escogido en el paso anterior.
– Dependiendo de las condiciones definidas para
rotar dependiendo del caso, se ejecuta la rotación.
Algoritmo Árbol AVL
• Buscar
– Búsqueda árbol binario
Ejercicios
• Diseñe un algoritmo para verificar si un árbol
ABB es AVL

También podría gustarte