Documente Academic
Documente Profesional
Documente Cultură
Red-Black Tree
Un red-black tree es un binary search tree con la diferencia de que asegura que el rbol esta aproximadamente balanceado. Aproximadamente balanceado significa que el largo del path de root a una hoja dentro del rbol no es mas grande que el doble del largo del path hacia otra hoja. Los nodos en un red-black tree requieren un dato adicional que es el color (rojo o negro).
Red-Black Tree
Un binary search tree es un red-black tree si satisface las siguientes propiedades:
1. 2. 3. 4. Todos los nodos son rojos o negros La raz es negra y todas las hojas (nodos null) son negras Si un nodo es rojo, sus hijos son negros (o si un nodo es rojo, su padre es negro) Para cada nodo, todos los paths de ese nodo hacia hojas descendientes contiene el mismo numero de nodos negros (black-height)
Red-Black Tree
7 3 18
10
22
11
26
Red-Black Tree
7 3 18
10
22
11
26
Red-Black Tree
7 3 18
10
22
11
26
Red-Black Tree
7 3 18
10
22
11
26
3. Si un nodo es rojo, sus hijos son negros (o si un nodo es rojo, su padre es negro)
Red-Black Tree
bh = 2
7 18 bh = 2
bh = 1
3
bh = 1
10
22 bh = 1
bh = 1
11 bh = 1
26 bh = 1
4. Para cada nodo, todos los paths de ese nodo hacia hojas descendientes contiene el mismo numero de nodos negros (black-height)
Rotations
Al ejecutar el algoritmo de insert y delete de un binary search tree sobre un red-black tree, el resultado puede haber alterado las propiedades del rbol Para recobrar estas propiedades se pueden hacer dos cosas: cambiar colores de nodos y/o modificar la estructura del rbol. La estructura del rbol se modifica por medio de los algoritmos LEFT-ROTATE y RIGHT-ROTATE, los cuales preservan la propiedad de binary-search-tree
Rotations
LEFT-ROTATE(T,x) x y A B C A B RIGHT-ROTATE(T,y) x C y
LEFT-ROTATE
LEFT-ROTATE(T,x) y right(x) right(x) left(y) parent(left(y)) x parent(y) parent(x) if parent(x) == null then root y else if x == left(parent(x)) then left(parent(x)) y else right(parent(x)) y left(y) x parent(x) y
LEFT-ROTATE
Ejemplo:
root 8 x
14
11
17
LEFT-ROTATE
Ejemplo:
root 8 y 5 14 x
11
17
LEFT-ROTATE
Ejemplo:
root 8 y 5 14 x
11
17
LEFT-ROTATE
Ejemplo:
root 8 y 5 14 x
11
17
LEFT-ROTATE
Ejemplo:
root 8 y 5 14 x
11
17
LEFT-ROTATE
Ejemplo:
8 root 5 14 y x
11
17
LEFT-ROTATE
Ejemplo:
x 8 11 5 17 root 14 y
LEFT-ROTATE
Ejemplo:
x 8 11 5 17 root 14 y
LEFT-ROTATE
Ejemplo:
x 8 11 5 17 root 14 y
LEFT-ROTATE
Ejemplo:
x 8 17 root 14 y
11
LEFT-ROTATE
Ejemplo:
root root
x 8 5 11 14 17 5 x 8 11 14 17
10
22
11
26
10
22
11 15
26
10
22
11 15
26
10
22
11 15
26
10
22
11 15
26
8 11
18 22 15
26
7 3 8 11
18 22 15
26
7 3 8 11
18 22 15
26
z parent(z) LEFT-ROTATE(T,z)
z parent(z) RIGHT-ROTATE(T,z)