0% encontró este documento útil (0 votos)
15 vistas44 páginas

11 Arboles Roji Negros

Descargar como pdf o txt
Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1/ 44

Fundamentos de análisis y

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

nil nil nil nil nil nil


15
13

nil nil nil nil


Árboles rojinegros

Propiedades de un árbol rojinegro


1.  Todo nodo es rojo o negro
2. Toda hoja (nil) es negra
3. La raíz es negra
4. Si un nodo es rojo, entonces sus hijos son negros
5. Cada camino de un nodo a sus hojas descendientes
contienen el mismo número de nodos negros
Árboles rojinegros
Propiedades de un árbol
rojinegro
1.  Todo nodo es rojo o negro 9
2.  Toda hoja (nil) es negra
7 12
3.  La raíz es negra
4.  Si un nodo es rojo, 6 8 14
10
entonces sus hijos son
negros nil nil nil nil nil nil
15
5.  Cada camino de un nodo a 13
sus hojas descendientes nil nil
nil nil
contienen el mismo número
de nodos negros
Árboles rojinegros

Indique si el siguiente árbol Propiedades de un árbol


es rojinegro rojinegro
1.  Todo nodo es rojo o negro
2.  Toda hoja (nil) es negra
9
3.  La raíz es negra
7 12 4.  Si un nodo es rojo,
entonces sus hijos son
10 14 negros
6 8
5.  Cada camino de un nodo a
15 sus hojas descendientes
9 13 contienen el mismo número
de nodos negros
Árboles rojinegros

Indique si el siguiente árbol es Propiedades de un árbol


rojinegro rojinegro
1.  Todo nodo es rojo o negro
2.  Toda hoja (nil) es negra
9
3.  La raíz es negra
7 12 4.  Si un nodo es rojo,
entonces sus hijos son
14 negros
6 8
5.  Cada camino de un nodo a
15 sus hojas descendientes
13 contienen el mismo número
de nodos negros
Árboles rojinegros

Indique si el siguiente árbol es Propiedades de un árbol


rojinegro rojinegro
1.  Todo nodo es rojo o negro
2.  Toda hoja (nil) es negra
8
3.  La raíz es negra
7 12 4.  Si un nodo es rojo,
entonces sus hijos son
10 14 negros
6
5.  Cada camino de un nodo a
9 15 sus hojas descendientes
13 contienen el mismo número
de nodos negros
Á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

Una árbol rojinegro con n nodos internos tiene altura, a lo


más, de 2lg(n+1)
2

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

Una árbol rojinegro con n nodos internos tiene altura, a lo


más, de 2lg(n+1)
2
Las operaciones SEARCH, MINIMUM,
MAXIMUN, SUCCESSOR, INSERT Y 1 4
DELETE se pueden realizar en tiempo
O(h), esto es, en el caso de árboles
rojinegros, O(lgn) 3 5
Árboles rojinegros
Acerca de INSERT y DELETE
Si se utilizan los procedimientos definidos para los árboles
de búsqueda binario se podría violar alguna de las reglas de
los árboles rojinegros

Es necesario definir una operación adicional para rotar los


nodos
Á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

α β β
γ
Á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

α β β
γ

Con la rotación se preserva el orden del árbol de


búsqueda binaria
Árboles rojinegros
RIGHT-ROTATE(T,y)
y x

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

Indique el resultado de LEFT-ROTATE(T, 4)

1 4

3 5
Árboles rojinegros
LEFT-ROTATE(T, x)
yright[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

Se asume que right[x]≠nil


Árboles rojinegros
LEFT-ROTATE(T, x)
yright[x] ¿Cuál es la complejidad del
algoritmo?
right[x]left[y]
p[left[y]]x
O(1)
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
Árboles rojinegros
LEFT-ROTATE(T, x)
Siga el algoritmo
yright[x]
right[x]left[y]
LEFT-ROTATE(T, 12)
p[left[y]]x
p[y]p[x] 9
if p[x]=nil
7 12
then root[T]y
else if x=left[p[x]] 14
6 10
8
then left[p[x]]y
else right[p[x]]y
15
13
left[y]x 9 11

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 yright[p[p[z]]]
if color[y]=RED
then color[p[x]]BLACK #Caso1
color[y]BLACK #Caso1
color[p[p[x]]]RED #Caso1
xp[p[x]] #Caso1
else if x=right[p[x]]
then xp[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

Dado el árbol T, se desea insertar x, key[x]=4

4 11

14
2

15
1 7

5 8
Árboles rojinegros

Dado el árbol T, se desea insertar x, key[x]=4

11 Se inserta y se colorea
de rojo
14
2
El árbol resultante no es
1 7
15 rojinegro

5 8

4
Árboles rojinegros

Caso 1: El padre de x y su tio son rojos, se pintan de


negro padre y tío de x, el abuelo de x queda entonces de
rojo
11
11

14
14 2
2
x
15
15 1 7
1 7

5 8
5 8

x
4
4
Árboles rojinegros

Caso 2: El padre de x es rojo pero su tío, y, es ahora negro


y x es hijo derecho de p[x]. Se rota a la izquierda p[x]
11 11
y y

14 7 14
2
x x
15 2 15
1 7 8

1 5
5 8

4 4
Árboles rojinegros

Caso 3: El padre de x es rojo pero su tío, y, es ahora negro


y x es hijo izquierdo de p[x]. Se cambian los colores de p
[x] y p[p[x]]. Se rota a la derecha p[p[x]]
7
11
y x
2 11
7 14

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 yright[p[p[z]]]
if color[y]=RED
then color[p[x]]BLACK #Caso1
color[y]BLACK #Caso1
color[p[p[x]]]RED #Caso1
xp[p[x]] #Caso1
else if x=right[p[x]]
then xp[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

Siga el algoritmo RB-INSERT(T, x), donde key[x]=11

20

25
7

23 30
5 15

3 6 10 17

1 4
Árboles rojinegros

Siga el algoritmo RB-INSERT(T, x), key[x]=12

20

25
7

30
5 15

3 10 17
Árboles rojinegros

Eliminación
Es una modificación de TREE-DELETE:

• Todas las referencias a nil se reemplazan por un nodo


centinela nil[T]. De esta forma, un nodo nil tiene un
puntero a su padre

• Se debe hacer un llamado al procedimiento TREE-


DELETE-FIXUP para cumplir con las condiciones de los
árboles rojinegros
RB-DELETE(T, z)
if left[z]=nil or right[z]=nil[T]
11
then yz
else yTREE-SUCCESSOR(z) 14
2
if left[y]≠nil[T]
then xleft[y] 15
1 7
else xright[y]
p[x]p[y]
if p[y]=nil[T] 5 8
then root[T]x
else if y=left[p[y]]
then left[p[y]]x
else right[p[y]]x
if y≠z
then key[z]key[y]
if color[y]=BLACK
then RB-DELETE-FIXUP(T,x)
return y
RB-DELETE(T, z)
if left[z]=nil or right[z]=nil[T]
11
then yz
else yTREE-SUCCESSOR(z) 14
2
if left[y]≠nil[T]
then xleft[y] 15
1 7
else xright[y]
p[x]p[y]
if p[y]=nil[T] 5 8
then root[T]x
else if y=left[p[y]]
then left[p[y]]x RB-DELETE(T,z), donde key
[z]=5
else right[p[y]]x
if y≠z
then key[z]key[y]
if color[y]=BLACK
then RB-DELETE-FIXUP(T,x)
return y
RB-DELETE(T, z)
if left[z]=nil or right[z]=nil[T]
11
then yz
else yTREE-SUCCESSOR(z) 14
2
if left[y]≠nil[T]
then xleft[y] 15
1 7
else xright[y]
p[x]p[y]
if p[y]=nil[T] 5 8
then root[T]x
else if y=left[p[y]]
then left[p[y]]x RB-DELETE(T,z), donde key
[z]=7
else right[p[y]]x
if y≠z
then key[z]key[y]
if color[y]=BLACK
then RB-DELETE-FIXUP(T,x)
return y
RB-DELETE(T, z)
if left[z]=nil or right[z]=nil[T]
11
then yz
else yTREE-SUCCESSOR(z) 14
2
if left[y]≠nil[T]
then xleft[y] 15
1 8
else xright[y]
p[x]p[y]
if p[y]=nil[T] 5
then root[T]x
else if y=left[p[y]]
then left[p[y]]x RB-DELETE(T,z), donde key
[z]=7
else right[p[y]]x
if y≠z
then key[z]key[y] Se cambian las llaves entre
7 y 8, y se deja de color
if color[y]=BLACK
negro el nodo (que ahora
then RB-DELETE-FIXUP(T,x) tiene el valor 8)
return y
RB-DELETE(T, z)
if left[z]=nil or right[z]=nil[T]
11
then yz
else yTREE-SUCCESSOR(z) 14
5
if left[y]≠nil[T]
then xleft[y] 15
2 6
else xright[y]
p[x]p[y]
if p[y]=nil[T] 7
1
then root[T]x
else if y=left[p[y]]
then left[p[y]]x RB-DELETE(T,z), donde key
[z]=1
else right[p[y]]x
if y≠z
then key[z]key[y] Es necesario un ajuste
if color[y]=BLACK
then RB-DELETE-FIXUP(T,x)
return y
RB-DELETE-FIXUP(T, x)
while x≠root[T] and color[x]=BLACK
do if x=left[p[x]]
then wright[p[x]]
if color[w]=RED
then color[w]BLACK
color[p[x]]RED
LEFT-ROTATE(T, p[x])
wright[p[x]]
if color[left[w]]=BLACK and color[right[w]]=BLACK
then color[w]RED
xp[x]
else if color[right[w]]=BLACK
then color[left[w]]BLACK
color[w]RED
RIGHT-ROTATE(T, w)
wright[p[x]]
color[w]color[p[x]]
color[p[x]]BLACK
color[right[w]]BLACK
LEFT-ROTATE(T, p[x])
xroot[T]
else #código simétrico intercambiando right y left
color[x]BLACK
Árboles rojinegros

Caso 1:

D
B
x w
B E
A D
x w
ε ξ
α β C E A C

α β γ δ
γ δ ε ξ

Se cambian los colores de B y D, y se realiza rotación a la izquierda


Este cambio genera uno de los 3 casos siguientes
Árboles rojinegros

Caso 2:

B B
x w x w

A D A D

α β C E α β C E

γ δ ε ξ γ δ ε ξ

La estrategia del algoritmo consiste en considerar el nodo x


como si tuviera un nodo extra, aumenta el conteo de negro en 2

En la rama de A, como se eliminó un nodo, el conteo de nodos


negros se debe disminuir al lado derecho de B, para esto, se
colorea de rojo el nodo con dos hijos negros
Árboles rojinegros

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

γ δ ε ξ α β γ δ

Para completar el conteo por la rama de A, se rota a la


izquierda B, el nodo E se cambia de color
RB-DELETE-FIXUP(T, x)
while x≠root[T] and color[x]=BLACK 5
do if x=left[p[x]]
then wright[p[x]]
if color[w]=RED 3 7
then color[w]BLACK
color[p[x]]RED
LEFT-ROTATE(T, p[x])
1
6 8
wright[p[x]]
if color[left[w]]=BLACK and color[right[w]]=BLACK
then color[w]RED
xp[x]
Siga el algoritmo
else if color[right[w]]=BLACK
RB-DELETE(T, 1)
then color[left[w]]BLACK
color[w]RED
RIGHT-ROTATE(T, w)
wright[p[x]]
color[w]color[p[x]]
color[p[x]]BLACK
color[right[w]]BLACK
LEFT-ROTATE(T, p[x])
xroot[T]
else #código simétrico intercambiando right y left
color[x]BLACK
Árboles rojinegros

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

También podría gustarte