You are on page 1of 51

ARBOLES

AVL, RED BLACK, SKIP LIST


Karim Guevara Puente de la Vega
2015
Índice
 Árbol perfectamente equilibrado
 Árbol AVL
 Árbol Red Black
 Skip List
BST equilibrados
 Característica de BST
 Ventaja: inserción, eliminación y búsqueda  O(logn)
• n = número de niveles
 Desventaja: se pierde eficiencia cuando h  m y su
complejidad se iguala a la de las listas
 m = número de nodos
 h = altura del árbol
 Solución: hay que mantener el árbol equilibrado
 Equilibrio perfecto
 Otros tipos de equilibrio (AVL, arboles rojo-negros, etc.)
BST perfectamente equilibrados
 Equilibrio perfecto
 Para cada nodo, el número de nodos del subárbol
izquierdo y el número de nodos del subárbol derecho
difieren como máximo en 1 unidad
BST perfectamente equilibrado
• Desplazar la mitad de nodos que sobran de un lado al
otro.
• Mantener la condición de BST al desplazar los nodos
Desplazar a derechas:
1. Insertar la Raíz en el subárbol derecho
2. Colocar como Raíz al mayor del subárbol
izquierdo
3. Repetir 1 y 2 tantas veces como el número de
nodos a desplazar.
Desplazar a izquierdas: (simétrico)

 Operaciones auxiliares:
 equilibrar(NodoABB actual)
 desplazarDerecha(NodoABB actual, int cuantos)
 desplazarIzquierda(NodoABB actual, int cuantos)
 Modificar algoritmos de inserción/borrado
- Re-equilibrado se hace desde arriba hacia abajo
BST perfectamente equilibrados
Arboles AVL - Definición
 Un árbol AVL (Adelson-Velskii y Landis) es un árbol
binario de búsqueda equilibrado
 Para cada nodo, las alturas de sus subárboles izquierdo y
derecho no difieren en más de 1
 El coste de sus operaciones es, por lo tanto, logarítmico
 El algoritmo para mantener un árbol AVL equilibrado se
basa en reequilibrados locales, de modo que no es
necesario explorar todo el árbol después de cada
inserción o borrado
Arboles AVL – Factor de equilibrio
 Cada nodo, además del dato y de las referencias a su
subárbol izquierdo y derecho, tiene un nuevo atributo: el
factor de equilibrio
 El factor de equilibrio es la diferencia entre las alturas
del subárbol derecho y el izquierdo:
FE = HDer – HIzq

 Por definición, para un árbol AVL, este valor debe ser -1,
0ó1
Árboles AVL - reestructuración
-1

1 65
-1
45 70
0 -1 0
33 54 68
0 RSD
50 Simple
RSI
Rotación
RDD
Compuesta
RDI
Árboles AVL – rotación simple derecha (RSD)
 Cuando el subárbol izquierdo de un nodo es 2 unidades
más alto que el derecho (FE = -2) y la raíz del subárbol
izquierdo tenga un FE = -1 (cargado a la izquierda)

P
Q
Árboles AVL – rotación simple derecha (RSD)
 Paso 1: el subárbol derecho de Q pasa a ser el subárbol
izquierdo de P

 Paso 2: el árbol P pasa a ser el subárbol derecho de Q:


Árboles AVL – rotación simple izquierda (RSI)
 Es el caso simétrico del anterior. Esta rotación se usa
cuando el subárbol derecho de un nodo es 2 unidades
más alto que el izquierdo y la raíz del subárbol derecho
está cargado a la derecha
Árboles AVL – rotación doble derecha (RDD)
 Cuando el subárbol izquierdo de un nodo es 2 unidades
más alto que el derecho (FE = -2) y la raíz del subárbol
izquierdo tenga un FE = 1 (cargado a la derecha)
P

R
Árboles AVL – rotación doble derecha (RDD)
 Paso 1: el subárbol izquierdo de R pasa a ser el
subárbol derecho de Q

 Paso 2: el árbol Q pasa a ser el subárbol izquierdo de R


Árboles AVL – rotación doble derecha (RDD)
 Paso 3: el subárbol derecho de R pasa a ser el subárbol
izquierdo de P

 Paso 4: el árbol P pasa a ser el subárbol derecho de R


Árboles AVL – rotación doble izquierda (RDI)
 Es el caso simétrico del anterior. Esta rotación se usa
cuando el subárbol derecho de un nodo es 2 unidades
más alto que el izquierdo y la raíz del subárbol derecho
está cargado a la izquierda
Pasos para la inserción
1. Seguir el camino de búsqueda del árbol, hasta localizar
el lugar donde hay que insertar el elemento.

2. Se inserta el elemento.

3. Se re-calcula el FE de todos los nodos que componen


el árbol.
 Si en alguno de los nodos se viola el criterio de equilibrio
entonces, reestructurar el árbol.
Pasos a seguir para eliminar un nodo
 Localizar su posición en el árbol.
 Eliminarlo siguiendo los criterios establecidos para el
BST.
 Regresar por el camino de búsqueda recalculando el FE
de los nodos visitados.
 Si en alguno de los nodos se viola el criterio de equilibrio,
entonces, reestructurar el árbol.
 El proceso concluye una vez que se llega hasta la raíz
del árbol.
Ejercicio
 Eliminar las siguientes claves: 82, 10, 39, 65, 70, 68 y
66
Clase NodeAVL

template<class E> class NodeAVL<E> {


private:
E data; // Dato almacenado en el nodo
NodeAVL<E> *left, *right; // Nodos hijo
int fe; // factor equilibrio
public:
// Constructores
NodeAVL(E data, NodeAVL<E> *left =0,
NodeAVL<E>* right=0){
this->data=data;
this->left=left;
this->right=right;
this->fe=0;
}
};
Clase AVLType
template<class E> class AVLType{
protected:
NodeAVL<E> *root;
bool height;
public:
AVLType();
void insert(E x);
void inOrder();
. . .
protected:
NodeAVL<E>* insert(E , NodeAVL<E> *);
NodeAVL<E>* balanceToRight(NodeAVL<E> *);
NodeAVL<E>* balanceToLeft(NodeAVL<E>*);
NodeAVL<E>* rotateSR(NodeAVL<E> *);
NodeAVL<E>* rotateSL(NodeAVL<E>*);
void inOrder(NodeAVL<E> *);
};
RED BLACK
Introducción
 De los BST salen diferentes tipos
de árboles entre los más
conocidos están los árboles AVL,
Rojo-Negros y Splay, de estos
tres árboles solo los AVL y los
árboles Rojo-Negro (RBT) son
estructuras balanceada o
semibalanceadas
Definición
 Fue inventada en 1972 por Rudolf Bayer quien los llamó "B-
Árboles binarios simétricos"
 Árbol binario en el que cada nodo tiene un color como atributo
extra, ya sea rojo o negro.

Red Node Black Node

 El color de los nodos asegura que la trayectoria más larga de


la raíz a una hoja no es más larga que el doble del largo de la
más corta.
 Se mantiene equilibrado por medio de rotaciones locales.
Definición
 El balance se controla en base a los colores de sus
nodos y ciertas propiedades que deben mantenerse
sobre esos colores.
 No es necesario explorar todo el árbol después de cada
inserción o borrado.
 Cada hoja es un nodo NULL (nil)
 bh(x): “función altura negra de un nodo x”. Se define
como el número de nodos negros de cualquier
trayectoria desde x hasta una hoja, sin contar el nodo x.
 La altura de un árbol RBT es h<=2log2(n+1)
Propiedades
1. Cada nodo es rojo o negro y la raíz siempre es negra.
2. Todas las hojas son negras, y la raíz es negra.
3. Ambos hijos de cada nodo rojo son negros.
4. Las trayectorias desde cada hoja hasta la raíz deben
tener el mismo numero de nodos negros
Estructura
 Los nodos del RBT además de presentar la clave y los
punteros (left, rigth, y opcionalmente father), posee un
campo más para el color.
Operaciones
 Como en un BST tiene las mismas operaciones:
 Inserción,
 Eliminación
 Búsqueda
 Recorrido
 Su innovación seria como en el AVL:
 Equilibrar el árbol.
• Restauración del color
• Rotaciones
Operaciones: Inserción de X
 Insertar X en el árbol como en el BST
 X se pinta de Rojo
 Restaurar las propiedades:
 1ra. y 2da. siguen vigentes
 4ta. sigue vigente (x es rojo y ambos hijos son negros)
 3ra. deja de cumplirse si el PADRE de X es Rojo
Restauración en la inserción
 Caso 1: El padre y el tío de X son rojos
 Ambos se pintan a negro
 El abuelo de X se pinta rojo
 El abuelo pasa a ser el nuevo X.
 Se evalúa nuevamente las reglas
X

5 5 5 5
insert(9)
3 7 3 7 3 7 3 7

X 9 9 9
Restauración en la inserción
 Caso 2: El padre de X es rojo, el tío de X es negro (o nill), X
es el hijo derecho (o izquierdo) de su padre, y el padre de X
es hijo izquierdo (o derecho) del abuelo:
 Realizar una RSI (o RSD) en el padre de X
 El nuevo X es el que era padre de X
 Se obtiene el caso 3.
5 5 5 RSI(padre) 5
insert(8)
3 9 3 9 3 9 3 9
1 1 1 1
6 6 6 8
8 8 6
RSI
X X
Restauración en la inserción
 Caso 3: El padre de X es rojo, el tío de X es negro (o nill), X
es el hijo derecho (o izquierdo), y el padre de X es hijo
derecho (o izquierdo) del abuelo:
 Cambiar el color del padre de X a Negro
 Cambiar el color del abuelo de X a Rojo
 Realizar una RSD (RSI) en el abuelo de X.

5 5 RSD
5
3 9 3 9
3 8
1 8 1 8
1 6 9
X 6 X 6
Restauración en la inserción
11
void colourRestore (NodeRBT *X) {
NodeRBT *Y;
while (X!=root && X->father->colour==RED) y
7 14
{ if (X->father==X->father->father>left){
Y = X->father->father->right; x
if (Y && Y->colour==RED) 2 8
{ X->father->colour=BLACK; 15
Y->colour=‘black’;
X->father->father->colour=RED; 1 5
X=X->father->father;
}
else { 4
if (X==X->father->right){ Caso 3
X=X->father;
rotateLeft (X);
}
X->father->colour=BLACK; 7
X->father->father->colour=RED; Caso 3
rotateRight (X->father->father);
} 2 11
}
else{
//simétrico 1 5 8 14
}
}
root->colour=BLACK; 4 15
}
Operaciones: Eliminación de X
 Se procede a eliminar X utilizando el algoritmo de BST
 Opcionalmente es necesario usar un nodo ficticio NILL
 Restaurar el color cuando el nodo a eliminar es
Negro
 Se invalida la 4ta. Propiedad
 Dados:
 x es el nodo que reemplazará el nodo a eliminar
 w es el hermano de x
 F[x] es el padre de x
 L[x] es el hijo izquierdo de x
 R[x] es el hijo derecho de x
 colour[x] color de x
Restauración en la Eliminación
 Caso 1: Si color de hermano w es rojo (colour[w]==RED)
 Cambiar el color del hermano w a negro
 Cambiar el color del padre de X a rojo
 Realizar RSI en el padre de X
 El nuevo w es el hijo derecho del padre de X
 Verificar demás casos

if (colour[w] == RED)
colour[w] = BLACK
colour[F[x]] = RED
rotateLeft(F[x])
w = R[F[x]]
Restauración en la Eliminación
 Caso 2: Si los dos hijos del hermano w son negros
(colour[L[w]] == BLACK  colour[R[w]] == BLACK)
 Cambiar el color del hermano w a rojo
 El nuevo X es el padre de X
 Verificar todos los casos

if (colour[L[w]]==BLACK 
colour[R[w]]==BLACK)
colour[w] = RED
x = F[x]
Restauración en la Eliminación
 Caso 3: Si el color del hijo derecho del hermano w es negro
y el izquierdo es rojo (colour[R[w]] == BLACK)
 Cambiar el color del hijo izquierdo de w a negro
 Cambiar el color de w a rojo
 Realizar RSD en el w
 El nuevo w es el hijo derecho del padre de X
 Efectuar Caso 4.

if (colour[R[w]]==BLACK)
colour[L[w]] = BLACK
colour[w] = RED
rotateRight(w)
w = R[F[x]]
Restauración en la Eliminación
 Caso 4: El hijo derecho del hermano w es rojo (el izquierdo
no interesa)
 w toma el color del padre de X
 El padre de X cambia a negro
 Cambiar el color del hijo derecho de w a negro
 Realizar RSI en el padre de X
 El nuevo X es la raíz

colour[w] = colour[F[x]]
colour[F[x]] = BLACK
colour[R[w]] = BLACK
rotateLeft(F[x])
x = root
Restauración en la Eliminación
procedure restoreRB ( T, x) {
while (x <> root[T]  colour[x] == BLACK)
if (x== L[F[x]])
w = R[F[x]]
if (colour[w] == RED)
colour[w] = BLACK Caso 1
colour[F[x]] = RED
rotateLeft(F[x])
w = R[F[x]]
if (colour[L[w]]==BLACK  colour[R[w]]==BLACK)
colour[w] = RED Caso 2
x = F[x]
else
if (colour[R[w]]==BLACK)
colour[L[w]] = BLACK Caso 3
colour[w] = RED
rotateRight(w)
w = R[F[x]]
colour[w] = colour[F[x]]
colour[F[x]] = BLACK Caso 4
colour[R[w]] = BLACK
rotateLeft(F[x])
x = root[T]

else // simetrico
colour[x] = BLACK
Ejercicio
 Elimine las siguientes claves a partir del RBT de la
figura (use la estrategia del antecesor en inorden): 20,
4, 9, 16, 18

4 16

2 6 10 20

1 3 5 7 18 40

8
AVL vs. RBT

AVL RBT
 Inserción, eliminación y  Inserción, eliminación y
búsqueda en O(log n). búsqueda en O(log n).
 Rotaciones: máximo 2.  Rotaciones: máximo 3.
 Diferencia entre el camino mas  Diferencia entre el camino mas
corto y el mas largo es máximo corto y el mas largo puede ser
1. 2.
 Más simples de implementar  Implementación mas compleja.
 Balanceo cuando hay una  Retarda el balanceo al máximo
diferencia de +2 o -2  El balanceo se basa en los
 El balanceo se basa en el FE colores de los nodos
Skip List
 Modificación de una "lista enlazada”, para el mejoramiento en
la eficiencia de la operación de búsqueda de datos
almacenados ordenadamente en esta estructura.
 Cada nodo puede tener uno o varios enlaces al nodo
siguiente y a diversos nodos a distancias variables, bien
establecidas de forma aleatoria o siguiendo un patrón
establecido de saltos a longitudes fijas.
Skip List
 Lista enlazada con cabecera (ordenada)
3 10 13 16 18 25 29 32 34 38

 Un puntero más a nodos pares: la búsqueda examina a lo


más n/2+1 nodos en el peor caso

3 10 13 16 18 25 29 32 34 38

 Un puntero más a cada nodo múltiplo de 4: se examinan a lo


más n/4+2 nodos en el peor caso

3 10 13 16 18 25 29 32 34 38
Skip List
 Caso Límite:
 Cada nodo múltiplo de 2i referencia al nodo que está 2i
lugares por delante de él ( i ≥ 0). “lista skip perfecta” en la
cual sucederá una búsqueda binaria: O(log2n).

3 10 13 16 18 25 29 32 34 38
Skip List
 Se define un nodo de nivel k como aquel nodo que
posee k referencias.
 La mitad de los nodos son de nivel 1, un cuarto de los
nodos son de nivel 2, etc.
 En general, aproximadamente n/2i nodos son de nivel i.
Skip List - búsqueda
 Empezar en la referencia de más alto nivel.
 Continuar en el mismo nivel hasta encontrar un nodo cuya
clave sea mayor al elemento a buscar, o sea NULL:
 Descender un nivel y continuar de la misma manera
 Cuando el avance se detiene en el nivel inferior, se ha
encontrado la clave o ésta no existe.
 P.e. buscar 29
Skip List - búsqueda
 Empezar en la referencia de más alto nivel.
 Continuar en el mismo nivel hasta encontrar un nodo cuya
clave sea mayor al elemento a buscar, o sea NULL:
 Descender un nivel y continuar de la misma manera
 Cuando el avance se detiene en el nivel inferior, se ha
encontrado la clave o ésta no existe.
 P.e. buscar 29
Skip List - búsqueda

Search ( list, searchKey )


x = list->header
for i=list->level-1 downto 1 do
while x->forward[i]->key < searchKey do
x=x->forward[i]
x = x->forward[0]
if x->key = searchKey then return x->value
else return error
Skip List - inserción
 Buscar en la estructura guardando la traza de los nodos en los que se
desciende de nivel
 Se determina aleatoriamente el nivel del nuevo nodo y se inserta,
enlazando las referencias convenientemente
 P.e. insertar 32
Skip List - eliminación
 Buscar la clave, descendiendo por niveles hasta encontrarla o no.
 Si la clave está, se elimina el nodo y se reacomodan sus
respectivos punteros.
 P.e. eliminar 29
Skip List Vs. BST
+ Su implementación es más sencilla
+ Es necesario menos espacio de almacenamiento para su
manejo (en operaciones intermedias)
+ En las operaciones de Inserción y eliminación no es
necesario rehacer (balancear) la estructura
+ Soporta fácilmente la mezcla, unión y diferencia de listas
─ No siempre la operación de búsqueda (e inserción) es más
rápida que en los BST
─ En muchos casos la dependencia de algoritmos con carácter
aleatorio puede dificultar el seguimiento de los movimientos
en la estructura y depuración de operaciones

You might also like