11 Arboles Roji Negros
11 Arboles Roji Negros
11 Arboles Roji Negros
diseño de algoritmos
Árboles rojinegros
Árboles rojinegros
Propiedades de un árbol rojinegro
Rotaciones
Insertar borrar elementos de un árbol rojinegro
Árboles rojinegros
Árboles rojinegros
Un árbol rojinegro es un árbol de búsqueda binario en el
que cada nodo tiene un bit extra para almacenar su color.
7 12
10 14
6 8
15
13
Árboles rojinegros
Árboles rojinegros
Un árbol rojinegro es un árbol de búsqueda binario en el
que cada nodo tiene un campo extra para almacenar su
color y
key[x]=7 9
x
p[x]=y
7 12
left[x]=w
w
right[x]=nil 14
6 8 10
color[x]=black
15
13
Árboles rojinegros
Árboles rojinegros
En los árboles rojinegros se colocan las referencias a nil
como nodos de color negro
9
7 12
6 8 14
10
1 4
3 5
Árboles rojinegros
Black-height (bh)
La altura negra de un nodo x, bh(x), es el número de nodos
negros en cualquier camino desde el nodo x (no incluido)
hasta una hoja
Rotaciones
Existen dos procedimientos, uno para rotar a la izquierda y
otro a la derecha
RIGHT-ROTATE(T,y)
y x
x LEFT-ROTATE(T,x)
γ α y
α β β
γ
Árboles rojinegros
Rotaciones
Existen dos procedimientos, uno para rotar a la izquierda y
otro a la derecha
RIGHT-ROTATE(T,y)
y x
x LEFT-ROTATE(T,x)
γ α y
α β β
γ
x LEFT-ROTATE(T,x)
γ α y
β γ
α β
RIGHT-ROTATE(T,8)
8 5
5 LEFT-ROTATE(T,5)
9 1 8
1 6 6 9
Con la rotación se preserva el orden del árbol de
búsqueda binaria
Árboles rojinegros
1 4
3 5
Árboles rojinegros
LEFT-ROTATE(T, x)
yright[x]
right[x]left[y]
p[left[y]]x
p[y]p[x]
if p[x]=nil
then root[T]y
else if x=left[p[x]]
then left[p[x]]y
else right[p[x]]y
left[y]x
p[x]y
p[x]y
Árboles rojinegros
Insertar un nodo en el árbol
Se usa el procedimiento TREE-INSERT y se colorea x de
rojo
Luego se modifica el árbol recoloreando nodos y haciendo
rotaciones
RB-INSERT(T, x)
TREE-INSERT(T,x)
color[z]RED
while color[p[x]]=RED
do if p[x]=left[p[p[x]]]
then yright[p[p[z]]]
if color[y]=RED
then color[p[x]]BLACK #Caso1
color[y]BLACK #Caso1
color[p[p[x]]]RED #Caso1
xp[p[x]] #Caso1
else if x=right[p[x]]
then xp[x] #Caso2
LEFT-ROTATE(T,x) #Caso2
color[p[x]]BLACK #Caso3
color[p[p[x]]RED #Caso3
RIGHT-ROTATE(T,p[p[x]]) #Caso3
else procedimiento simétrico cambiando “right” pot “left”
color[root[T]]BLACK
Árboles rojinegros
4 11
14
2
15
1 7
5 8
Árboles rojinegros
11 Se inserta y se colorea
de rojo
14
2
El árbol resultante no es
1 7
15 rojinegro
5 8
4
Árboles rojinegros
14
14 2
2
x
15
15 1 7
1 7
5 8
5 8
x
4
4
Árboles rojinegros
14 7 14
2
x x
15 2 15
1 7 8
1 5
5 8
4 4
Árboles rojinegros
x
2 15
8 1 5 8 14
1 5 4 15
4
RB-INSERT(T, x)
TREE-INSERT(T,x)
color[z]RED
while color[p[x]]=RED
do if p[x]=left[p[p[x]]]
then yright[p[p[z]]]
if color[y]=RED
then color[p[x]]BLACK #Caso1
color[y]BLACK #Caso1
color[p[p[x]]]RED #Caso1
xp[p[x]] #Caso1
else if x=right[p[x]]
then xp[x] #Caso2
LEFT-ROTATE(T,x) #Caso2
color[p[x]]BLACK #Caso3
color[p[p[x]]RED #Caso3
RIGHT-ROTATE(T,p[p[x]]) #Caso3
else procedimiento simétrico cambiando “right” pot “left”
color[root[T]]BLACK
Árboles rojinegros
20
25
7
23 30
5 15
3 6 10 17
1 4
Árboles rojinegros
20
25
7
30
5 15
3 10 17
Árboles rojinegros
Eliminación
Es una modificación de TREE-DELETE:
Caso 1:
D
B
x w
B E
A D
x w
ε ξ
α β C E A C
α β γ δ
γ δ ε ξ
Caso 2:
B B
x w x w
A D A D
α β C E α β C E
γ δ ε ξ γ δ ε ξ
Caso 3:
B B
x w x w
A D A C
α C E α γ D
β β
γ δ ε ξ δ E
ε ξ
Se ajusta el conteo creando una rama con hb=2, antes, la
rama B-D-C no tenía conteo 2
Árboles rojinegros
Caso 4:
B D
x w x w
A D B E
α C E A ε ξ
β C
γ δ ε ξ α β γ δ
Eliminación
Dado T, siga el algoritmo RB-
DELETE(T, 7)
11
14
2
15
1 7
5 8
Árboles rojinegros
Eliminación
Dado T, siga el algoritmo RB-DELETE(T, 4)
7
3
4 6 8