Está en la página 1de 45

Red-Black Trees

Ing. Andrea Quan

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

1. Todos los nodos son rojos o negros

Red-Black Tree
7 3 18

10

22

11

26

2. La raz es negra y todas las hojas (nodos null) son negras

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

Red-Black Tree: Insert


Para insertar un nodo en el red-black tree tenemos que hacer 3 cosas: 1. Insertar el nodo (como en el Binary Search Tree) 2. Colorear el nodo de rojo 3. Arreglar el rbol en caso de que el ingreso haya provocado que ya no cumpla con las propiedades de red-black tree

Red-Black Tree: Insert


7 3 18

10

22

11

26

Insertemos 15 a este rbol

Red-Black Tree: Insert


Insertar el nodo y coloreamos de rojo 7 18

10

22

11 15

26

Red-Black Tree: Insert


Nuevo nodo no conservo propiedades 3 7 18

10

22

11 15

26

Red-Black Tree: Insert


Recoloreamos para cambiar la anomalia a hacia arriba 3 7 18

10

22

11 15

26

Red-Black Tree: Insert


Al cambiar de colores, estos nodos no cumplen la propiedad 3 7 18

10

22

11 15

26

Red-Black Tree: Insert


Right-Rotate(18) 7 3 10

8 11

18 22 15

26

Red-Black Tree: Insert


Left-Rotate(7) 10

7 3 8 11

18 22 15

26

Red-Black Tree: Insert


recoloreamos 10

7 3 8 11

18 22 15

26

Red-Black Tree: Insert


RB-Insert(T,z) ynull xroot while x != null do y x if key(z) < key(y) then x left(x) else x right(x) parent(z) y if y == null then root z else if key(z) < key(y) then left(y) z else right(y) z left(z) null right(z) null color(z) RED RB-Insert-Fixup(T,z)

Red-Black Tree: Insert


RB-Insert(T,z) ynull xroot while x != null do y x if key(z) < key(y) then x left(x) else x right(x) parent(z) y if y == null then root z else if key(z) < key(y) then left(y) z else right(y) z left(z) null right(z) null color(z) RED RB-Insert-Fixup(T,z)

Insert del Binary Search Tree

Red-Black Tree: Insert-Fixup


Se ejecuta mientras hayan dos nodos rojos seguidos o la raiz sea roja. Mantiene la propiedad de Binary Search Tree durante todas sus iteraciones. Se divide en seis casos: 3 lado derecho, 3 lado izquierdo (simtricos)

Red-Black Tree: Insert-Fixup


RB-Insert-Fixup(T,z) while color(parent(z)) == RED do if parent(z) == left(parent(parent(z))) then y right(parent(parent(z))) if color(y) == RED then CASO #1 else if z == right(parent(z)) then CASO #2 CASO #3 else lo mismo, cambiando left right color(root) BLACK

Red-Black Tree: Insert-Fixup


CASO #1
C Y A Z B D A B D recolorear C Z

Red-Black Tree: Insert-Fixup


CASO #1
C Y A Z B D A B D C Z

color(parent(z)) BLACK color(y) BLACK color(parent(parent(z)) RED z parent(parent(z))

Red-Black Tree: Insert-Fixup


CASO #1 - Simtrico
C Y D B A Z D B A Z C

color(parent(z)) BLACK color(y) BLACK color(parent(parent(z)) RED z parent(parent(z))

Red-Black Tree: Insert-Fixup


CASO #2
C Y A Z B A B LEFT-ROTATE (A) C

Red-Black Tree: Insert-Fixup


CASO #2
C Y A Z B A B C

z parent(z) LEFT-ROTATE(T,z)

Red-Black Tree: Insert-Fixup


CASO #2 - Simtrico
C Y A B Z B A C

z parent(z) RIGHT-ROTATE(T,z)

Red-Black Tree: Insert-Fixup


CASO #3
C y B Z A A C RIGHT-ROTATE (C) B

Red-Black Tree: Insert-Fixup


CASO #3
C y B Z A A C B

color(parent(z)) BLACK color(parent(parent(z)) RED RIGHT-ROTATE(T,parent(parent(z)))

Red-Black Tree: Insert-Fixup


CASO #3 - Simtrico
C y B A Z C A B

color(parent(z)) BLACK color(parent(parent(z)) RED LEFT-ROTATE(T,parent(parent(z)))

Red-Black Tree: Insert-Fixup


RB-Insert-Fixup(T,z) while color(parent(z)) == RED do if parent(z) == left(parent(parent(z))) then y right(parent(parent(z))) if color(y) == RED then color(parent(z)) BLACK color(y) BLACK color(parent(parent(z)) RED z parent(parent(z)) else if z == right(parent(z)) then z parent(z) LEFT-ROTATE(T,z) color(parent(z)) BLACK color(parent(parent(z)) RED RIGHT-ROTATE(T,parent(parent(z))) else lo mismo, cambiando left right color(root) BLACK