You are on page 1of 26

1

Captulo 12.

rboles coloreados. Red black.


Si las claves siempre ingresan ordenadas en forma aleatoria, puede emplearse un rbol binario
de bsqueda. Sin embargo si por momentos se producen ingresos de claves en orden, debe
escogerse una estructura que pueda rebalancear dinmicamente el rbol. El rbol coloreado,
como se ver, tiene un criterio de balance un tanto ms relajado que un AVL.
Por esta razn, si los datos ingresan preponderantemente ordenados el rbol AVL tiene un mejor
comportamiento que el red-black, ya que tiene una altura menor.
Si los datos son accesados mayormente en forma secuencial, el rbol desplegado, splay, tiene un
mejor comportamiento que los anteriores.

12.1. Propiedades de los rboles coloreados.


Se agrega a cada nodo un dato que indica su color. Existen reglas que deben cumplirse para
asignar el color a cada nodo, de tal modo que una trayectoria cualquiera desde un nodo a una
hoja no sea mayor que el doble del largo de cualquier otra. Esto asegura que el rbol coloreado
se mantenga ms o menos balanceado, asegurando un costo logartmico para las operaciones en
peor caso.

Propiedades:
1. Cualquier nodo es rojo o negro.
2. Cualquier descendiente de hoja se considera negro. (Los nodos externos, son negros; stos no
son nodos con informacin.) La raz debe ser negra.
3. Si un nodo es rojo, sus hijos son negros. No hay dos rojos adyacentes.
4. Cualquier trayecto desde un nodo hacia una hoja contiene el mismo nmero de nodos negros.
La Figura 15.1 muestra los nodos con valores 4, 7, 12 y 20 de color rojo. La estructura cumple
las propiedades anteriores.
9

15

4
2

12

20

Figura 12.1 rbol de bsqueda binaria coloreado.


Profesor Leopoldo Silva Bijit

26-05-2008

Estructuras de Datos y Algoritmos

Una buena interpretacin de los nodos rojos en un rbol coloreado, es dibujarlos en un nivel
horizontal, de este modo se refleja que no alteran las alturas negras de los nodos. Esto se
muestra en la Figura 12.2, para el rbol coloreado de la Figura 12.1. En la representacin con
rojos en nivel horizontal, debe cuidarse que cada nodo tenga dos hijos, para que el rbol sea
binario.
Tambin puede verse, con esta representacin, que en un rbol coloreado todas las hojas tienen
la misma altura. El rbol coloreado es un caso particular de un B-Tree, en los cuales los nodos
pueden almacenar varias claves.

4
2

9
5

12

15

20

Figura 12.1a rbol coloreado con rojos horizontales.


Debido a la presencia de nodos rojos, al menos la mitad de los nodos de un trayecto de un nodo
hasta las hojas deben ser negros.
La trayectoria ms larga, una que alterna entre nodos rojos y negros, es slo el doble del largo
de la trayectoria ms corta, la formada slo por nodos negros.

Figura 12.2 Trayectos en peor caso.


Luego de insertar desde el 1 hasta el 14, que es un peor caso de rbol binario de bsqueda, en el
rbol coloreado que se muestra en la Figura 12.2, el trayecto ms largo es de 6 nodos por la va
ms larga y de tres nodos por la ms corta.
En la Figura 12.2, puede comprobarse que las alturas negras de todos los nodos son iguales, y
que no hay dos rojos adyacentes; adems la raz es negra, cumpliendo todas las propiedades.
Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

12.2. Complejidad en rboles coloreados.


En un rbol coloreado, con n nodos internos, debe cumplirse que la altura h es a lo ms:

h 2log(n 1)
Se define la funcin altura negra de un nodo x, bh(x), como el nmero de nodos negros de
cualquier trayectoria desde x hasta una hoja, no contando el nodo x.
Se desea probar, mediante induccin, que un subrbol, que parte en el nodo x, contiene a lo
menos 2bh(x)-1 nodos internos.
Si x es un nodo externo, entonces bh(x) = 0, y el nmero de nodos internos es: 20-1=0.
Si x es una hoja, entonces bh(x) = 1, y el nmero de nodos internos es: 21-1=1.
Si x tiene alto h, los nodos hijos de x, tienen altura (h-1).
Si el hijo es rojo tiene altura negra: bh(x), igual a la del padre
Si el hijo es negro tiene altura negra: bh(x)-1, ya que no se cuenta el nodo negro.
Considerando verdadera la proposicin para el nmero de nodos internos del subrbol que
comienza en x; los subrboles de los hijos de x, deben entonces tener a lo menos: 2bh(x)-1-1
nodos internos.
Para obtener el nmero de nodos internos del subrbol que comienza en x, sumamos los nodos
internos de los subrboles hijos, ms el nodo interno x, se obtiene:

n >= (2bh(x)-1-1) + (2bh(x)-1-1) + 1 = 2(2bh(x)-1) - 1=2bh(x)-1


Lo cual demuestra la proposicin inicial.
Pero en un rbol coloreado al menos la mitad de los nodos de un trayecto de un nodo hasta las
hojas deben ser negros, entonces si h es la altura de un rbol, que comienza en x, se tiene que:

bh( x)

h
2

Entonces, reemplazando en la expresin de n, en funcin de bh(x), la cota para bh(x), se obtiene:

n 2bh( x) 1 2h / 2 1
Despejando h, se logra:

h 2log(n 1)

(log(n))

Debe notarse que sta es la complejidad de peor caso.


Al insertar o descartar nodos en un rbol coloreado, pueden violarse las propiedades que los
definen; y para mantenerlo coloreado, como se ver ms adelante, deben cambiarse los colores
Profesor Leopoldo Silva Bijit

26-05-2008

Estructuras de Datos y Algoritmos

de algunos nodos y tambin posiblemente efectuar rotaciones. Esto se refleja en un costo


adicional para las funciones de insercin y descarte en un rbol binario de bsqueda.
Para un rbol AVL, la cota para la altura resulta menor que en rbol coloreado:

hAVL

1, 4404 log(n)

(log(n))

La Figura 12.2a, muestra la complejidad del rbol coloreado, respecto del AVL, y puede
observarse que son muy similares. Pero las operaciones se realizan en menor tiempo, en un
rbol coloreado.
En un rbol binario de bsqueda, en promedio, si las claves llegan aleatoriamente, se tiene la
(log(n)) . Pero sta se incrementa hasta n, en el peor caso.
altura: hBST 1,3863log( n)

coloreado
AVL
Bst promedio

balanceado

Figura 12.2a. Comparacin de complejidades. Red-Black, AVL, Balanceado.

12.3. Anlisis de insercin.


La insercin de un nuevo nodo siempre se realiza como descendiente de una hoja. Se inserta el
nuevo nodo con color rojo, ya que esto no altera las alturas negras de los trayectos. Cuando la
hoja donde se insertar el nuevo nodo es roja, se pierde la propiedad de ser un rbol coloreado,
ya que se producen dos nodos rojos adyacentes.
Si se inserta un nodo con color rojo, y si el rbol estaba vaco, debe cambiarse a negro para
mantener la propiedad de que la raz sea negra.
Si se inserta un nodo en la raz, como sta es negra, se mantienen las propiedades de los rboles
coloreados.
En caso de insercin en rboles de mayores niveles, la insercin de un rojo en una hoja roja
requiere efectuar modificaciones para preservar las propiedades, en algunos casos bastar una
Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

recoloracin y en otros deben efectuarse rotaciones. A medida que se van efectuando estas
modificaciones puede que en el ascenso hacia la raz se vuelva a producir la situacin de dos
rojos adyacentes. Estudiaremos los diferentes casos que se producen y las soluciones propuestas
para mantener las propiedades.
Lo primero que observamos es que cuando se produce un doble rojo, el abuelo del nodo rojo
insertado o del rojo que asciende debe ser negro, a este ltimo nodo lo denominaremos con x, en
los diagramas. Esto es as ya que antes de la insercin el rbol era coloreado, y por lo tanto no
pueden tenerse tres rojos adyacentes. La segunda consideracin es que las alturas negras del
nodo denominado abuelo deben ser iguales antes y despus de la insercin; esto se ilustrar en
los diagramas, colocando nodos negros de tal modo de reflejar las alturas negras iguales. Se
prefiere esta representacin a la de mostrar subrboles descendientes con especificaciones de
alturas negras. Una tercera consideracin es que el to del nodo rojo que asciende puede ser
negro o rojo, y que debern analizarse ambos casos.
Se ilustran en la Figura 12.3, alturas negras del abuelo iguales a dos (ms la altura negra de los
descendientes, que no se muestran), se muestra el to de color negro.
Dicho de otra forma, el diagrama insina que las alturas negras del to y de los hijos negros de
los nodos rojos deben ser iguales, y menores en una unidad a la altura negra del abuelo.
abuelo

abuelo
to

to
x

Figura 12.3 Dobles rojos en insercin.


Existen dos casos adicionales, que son las imgenes especulares de las mostradas en la Figura
12.3, y que corresponden a los casos en que el nodo x es insertado como descendiente derecho
del nodo abuelo.
Existen dos situaciones que deben analizarse: una corresponde a to rojo, la otra a to negro.
12.3.1. Recoloracin. Cuando el to es rojo.
Si en la Figura 12.4 a la izquierda, se cambian los colores del abuelo, el padre y el to, se
mantienen las alturas negras del nodo abuelo hacia abajo, y no se tienen dos rojos adyacentes.
Sin embargo es necesario seguir la revisin ascendente debido a que el cambio de color del
abuelo podra producir nuevamente un doble rojo en el trayecto hacia la raz. Es decir debe
volver a repetirse el proceso ascendiendo el puntero x a la posicin del abuelo.
Si los cambios se propagarn hasta el caso en que el abuelo es la raz, debera cambiarse el color
de sta, pero se mantendran altura negras iguales; en este caso aumenta la altura negra del
rbol.

Profesor Leopoldo Silva Bijit

26-05-2008

Estructuras de Datos y Algoritmos


abuelo
padre

abuelo
padre

to

to

Figura 12.4 Recoloracin en insercin. To rojo.


Cuando el nodo denominado x es descendiente derecho del padre, se soluciona de igual forma.
12.3.2. Rotaciones. Cuando el to es negro.
Se ilustra el caso en que el padre y el nodo x son descendientes izquierdos del nodo abuelo. Si se
cambian colores al padre y al abuelo, se disuelve el doble rojo. Sin embargo se altera la altura
negra del subrbol derecho del abuelo, como se muestra en la Figura 12.5, disminuye su cuenta
en uno.
abuelo
padre

abuelo

to

padre

to

Figura 12.5 Recoloracin con to negro, no quedan dos rojos adyacentes.


Si se efecta una rotacin a la derecha de la pareja padre-abuelo, en la Figura 12.5 a la derecha
se tiene la Figura 12.6 derecha.
A partir del nodo padre hacia abajo se mantienen los largos negros de los subrboles y adems
no se puede volver a producir un doble rojo en el trayecto de ascenso hacia la raz, ya que el
nodo, denominado padre, en la Figura 12.6 derecha, es negro. Ntese que en la Figura 12.6 a la
derecha, se han conservado los nombres originales para los nodos: padre, abuelo y to; sin
embargo luego de la rotacin stos nombres pierden su significado original. Tambin puede
observarse que luego de la rotacin el sub-rbol, cuya raz es el padre, queda ms balanceado.
Esta situacin da por terminada la revisin ascendente.
abuelo
padre

to

padre
abuelo

to

Figura 12.6 Rotacin derecha, preserva altura negras.

Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

An resta analizar el caso en que el doble rojo se produce como hijo derecho de un padre rojo
descendiente de un abuelo negro (y con to negro). Lo cual se ilustra en la Figura 12.7.
abuelo
padre

abuelo

to

to

padre
x

Figura 12.7. Rotacin izquierda, par padre-x.


Antes de producirse este doble rojo, ya sea por insercin o por revisin ascendente, las alturas
negras del padre (del abuelo y sus ancestros) eran iguales. La rotacin izquierda del par xpadre, respecto al padre, no altera esas cuentas. La Figura 12.7 a la derecha, es el caso analizado
antes, que se muestra en la Figura 12.5; para el cual ya se obtuvo una solucin, pero cambiando
el puntero x a la posicin ocupada finalmente por el padre.
Los casos en que el nodo x es agregado como descendiente del subrbol derecho del abuelo son
situaciones con simetra especular a los tratados.
Un caso particular es cuando el to no existe, es decir cuando es un nodo externo; en este caso se
considera to de color negro.
Esto completa el anlisis de la insercin en un rbol coloreado.

12.4. Anlisis de la operacin descartar.


Deben analizarse tres casos, que el nodo que se desea descartar tenga dos descendientes, uno
solo o ninguno.
Cuando se borra un nodo rojo se mantienen las propiedades de los rboles coloreados. Ya que
no cambian las alturas negras de los nodos.
12.4.1. Dos descendientes.
Cuando se borra un nodo apuntado por t, que tiene los dos subrboles descendientes, se elige el
mayor descendiente del subrbol izquierdo (I) o el menor descendiente del subrbol derecho (D)
y se cambian los datos del nodo que ser eliminado con el seleccionado. Si el nodo seleccionado
(I o D) es rojo, no puede tener descendientes y ser una hoja; estos casos se muestran en la
Figura 12.8.

Profesor Leopoldo Silva Bijit

26-05-2008

Estructuras de Datos y Algoritmos

t
t
I D

Figura 12.8. Nodo seleccionado para ser descartado es hoja roja.


Si el nodo seleccionado es negro, slo puede tener un hijo rojo ya que el rbol es coloreado,
antes del descarte. Situacin que se muestra en la Figura 12.9.

t
I D

Figura 12.9. Nodo seleccionado para ser descartado es nodo negro con hijo rojo.
Luego de copiar los datos del nodo seleccionado en el nodo apuntado por t, se procede a
descartar el seleccionado; el cual debe ser una hoja roja o un nodo negro con slo un hijo que
debe ser rojo. Estos casos se analizan a continuacin.
12.4.2. Un descendiente.
Cuando se descarta un nodo t con un solo hijo, se presentan tres casos, que se ilustran en la
Figura 12.10, cuando t tiene hijo izquierdo y es un descendiente izquierdo. Debe notarse que el
nodo t debe ser negro, y que su nico hijo debe ser rojo.
t

Figura 12.10 Descartar nodo negro con un hijo rojo.


Se preservan las propiedades de los rboles coloreados si se liga el hijo de t, con el padre de
ste; y se le cambia el color a negro, para mantener iguales alturas negras, y no tener dos rojos
adyacentes. Igual solucin se aplica si el hijo de t es descendiente derecho.
Las soluciones se muestran en la Figura 12.10a.
t

Figura 12.10a Descartar nodo negro con un hijo rojo.

Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

Si t es descendiente derecho, la solucin es la especular de la analizada.


12.4.3. El nodo a descartar es una hoja. Sin descendientes.
En este caso se presentan cinco situaciones, que se ilustran en la Figura 12.11.

Figura 12.11 Descartar hoja.


Cuando el padre es rojo, ste debe tener dos hijos negros. Luego de borrar el nodo hay que
cambiar el color del padre y del to; esto preserva iguales alturas negras.
Cuando el nodo para descartar es rojo, hay dos casos: con hermano nulo o con hermano rojo.
Ambos casos no requieren modificaciones, y slo es preciso borrar el nodo.
Cuando el nodo y su padre son negros se tienen dos casos, con hermano negro o rojo. En este
ltimo caso, luego de borrar el nodo el rbol deja de ser coloreado, ya que disminuye la altura
negra del subrbol izquierdo; se soluciona rotando a la izquierda, el par padre-hermano, y
cambiando de rojo a negro el color del nuevo padre, para igualar las alturas negras. Lo cual se
muestra en la Figura 12.12. En este caso, como el hermano es rojo, el padre necesariamente
debe ser negro.
t

Figura 12.12 Descartar hoja negra con hermano rojo.


El ltimo caso que debe analizarse es el de hijo, padre y hermano de colores negros. Si se
elimina la hoja y se cambia a color rojo el hurfano, se produce una disminucin de la altura
negra del nodo padre, denominado x, en la Figura 12.13, lo cual har perder al rbol sus
propiedades. Ntese que de x hacia abajo el rbol es coloreado.
x

Figura 12.13 Descartar hoja negra con padre y hermano negro.


La altura negra de x es bh(x)=0, si no se cuenta el nodo externo; y uno si se cuenta el nodo
externo.

Profesor Leopoldo Silva Bijit

26-05-2008

10

Estructuras de Datos y Algoritmos

Para corregir el balance de alturas negras debe efectuarse una revisin ascendente.
12.4.4. Balance de alturas negras en descarte. Caso doble negro.
Sea x un puntero al subrbol coloreado, que disminuy su altura negra, y desde el cual debe
revisarse hacia arriba para mantener la propiedad de iguales alturas negras de los subrboles. La
raz de este subrbol es negra.
Si x es la raz debe detenerse la revisin.
a) Hermano rojo.
Si x tiene padre y el hermano h es rojo, el padre debe ser negro. La Figura 12.14, a la izquierda,
ilustra este caso, cuando x es descendiente izquierdo.

Figura 12.14 Hermano rojo, padre negro.


Si la altura negra de x es bh(x), las alturas negras de los subrboles descendientes del hermano
rojo son iguales a bh(x)+1. Esto se ilustra con dos descendientes negros en los subrboles de h.
Si el rbol era coloreado, antes del descarte, necesariamente x tiene padre, hermano y
descendientes.
Si se cambia el color del padre y del hermano se tiene el resultado que se muestra en la Figura
12.14, al centro. Luego rotando a la izquierda el par padre-hermano, se obtiene la situacin
mostrada a la derecha de la Figura 12.14, en la cual se ha reposicionado h, apuntado al hermano
actual de x.
Tanto el actual abuelo como el padre de x, siguen desbalanceados. El objetivo de esta
transformacin es lograr que x tenga un hermano negro. Que es el siguiente caso que se estudia.
b) Hermano negro.
Si el hermano es negro, el padre puede ser rojo o negro. Lo cual se representar por un signo de
interrogacin al lado del nodo.
En esta situacin se tienen tres casos que analizar: Una es si ambos hijos del hermano son
negros; la segunda es si el hijo derecho del hermano es negro y el izquierdo es rojo; y la tercera
es que el hijo derecho del hermano sea rojo, pudiendo ser rojo o negro el hijo izquierdo del
hermano.
b1) Sobrinos negros.
Si x y su hermano son negros, los subrboles descendientes de h, tienen altura negra igual a
bh(x)+1, lo cual se insina con un descendiente, en la Figura 12.15. Esto es as, ya que
originalmente se borr un descendiente negro de x, cuando el rbol era coloreado.
Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

11

Si se cambia el color del hermano a rojo, y se mueve x, apuntando al padre, se tendr que desde
el nuevo x hacia abajo el rbol es coloreado. Adems se fuerza a negro el padre original de x,
para evitar un posible doble rojo.
?
x

x
h

Figura 12.15 Hermano negro y sobrinos negros.


Luego de esta transformacin la altura negra del nuevo x, aumenta en uno; y se debe seguir
revisando en forma ascendente hacia la raz. No es necesario continuar, si el nuevo x es la raz.
b2) Sobrino derecho negro, sobrino izquierdo rojo.
Como x y su hermano son negros, el padre de x puede ser rojo o negro. Nuevamente los
descendientes de h, deben tener alturas negras: bh(x)+1.
?
h

?
h

?
h

h
h

Figura 12.16 Hermano y sobrino derecho negros.


Primero se cambian los colores del hermano negro y del sobrino rojo, esto se muestra en el
medio de la Figura 12.16. Luego se rota a la derecha el par hermano-sobrino derecho, lo cual se
muestra a la derecha en la Figura 12.16, en la cual se mueve h, para apuntar al nuevo hermano
de x. Esta transformacin conduce al caso siguiente, en la que el sobrino derecho es rojo.
b3) Sobrino derecho rojo, sobrino izquierdo negro.
El padre de x, puede ser rojo o negro. Se procede a copiar el color del padre en el hermano, y
pintar de negro al padre y al sobrino rojo, resultado que se muestra al centro de la Figura 12.17.
x

?
h

x
?
h

?
h

h
x

Figura 12.17 Hermano negro, sobrino derecho rojo.

Profesor Leopoldo Silva Bijit

26-05-2008

12

Estructuras de Datos y Algoritmos

Luego se rota a la izquierda el par padre-hermano, resultando la ilustracin a la derecha de la


Figura 12.17. En sta se ha logrado reestablecer las alturas negras de todos los nodos desde h
hacia abajo. No es preciso continuar la revisin ascendente, y el rbol completo es coloreado.
Si h queda apuntando a la raz, debe forzarse el color negro en ese nodo.
El caso en que ambos sobrinos son rojos, se trata de igual forma que el caso b3).

?
h

Figura 12.18 Hermano negro, sobrinos rojos.


Esto completa el anlisis del descarte de un nodo.

12.5. Estructura de datos y funciones bsicas.


12.5.1. Estructura de datos.
Si las operaciones de insercin y descarte se implementan en forma recursiva, la ruta de
bsqueda queda almacenada en el stack, es decir se disponen de las referencias al padre y al
abuelo. Despus de un retorno de una funcin que tiene como argumento un nodo apuntado por
t; se tiene ahora en t, el puntero al padre del anterior. De esta forma es posible definir un nodo
con slo dos punteros, el izquierdo y el derecho, adems del color.
Sin embargo si las exigencias de espacio no son fundamentales la eleccin de una estructura que
adicionalmente mantenga un puntero al padre del nodo, presenta ventajas en la velocidad de
ejecucin de las operaciones. Adems las funciones resultan iterativas, y no se produce un gran
espacio del stack, para almacenar los argumentos de las funciones recursivas.
typedef struct nn {
/* RB-Tree */
int color;
/* Solo puede ser Rojo o Negro */
int clave;
/* clave entera */
struct nn *left, *right, *padre; /* tres punteros */
} nodo, *pnodo;
12.5.2. Crea un nodo para insercin.
Se inicia el nodo con color rojo.
#define
RED
0
#define
BLACK
1

Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

13

pnodo CreaNodo(int valor)


{ pnodo t = (pnodo) malloc(sizeof(nodo));
if (t != NULL)
{ t->color=RED; t->clave=valor;
t->left=NULL; t->right=NULL; t->padre=NULL;
}
return t;
}
12.5.3. Sucesor.
El diseo del sucesor es simple si se dispone de un puntero al padre.
pnodo sucesor(pnodo x)
{ pnodo y;
if (x->right!=NULL)
{
/* Si hay subrbol derecho desciende por la izquierda en ste,
** hasta encontrar nodo sin descendiente izquierdo.
*/
for (y=x->right; y->left!=NULL; y=y->left);
}
else
{
/* Ascender hasta encontrar nodo que est a la izquierda de su padre
** ( o la raz) entonces retornar el padre.
*/
for(y=x->padre; y!=NULL && x==y->right; x=y, y=y->padre );
}
return(y);
}
12.5.4. Predecesor.
Basta cambiar left por right, y viceversa, en el cdigo del sucesor.
pnodo predecesor(pnodo x)
{ pnodo y;
if (x->left!=NULL) for (y=x->left; y->right!=NULL; y=y->right);
else
{ y=x->padre;
while(y!=NULL && x==y->left){x=y; y=y->padre;}
}
return(y);
}

Profesor Leopoldo Silva Bijit

26-05-2008

14

Estructuras de Datos y Algoritmos

12.5.5. Rotacin a la izquierda.


Se pasa la raz del rbol por referencia. Esto en caso que el nodo Y, se convierta en la nueva
raz.
/*
** Rotacin izquierda con padre
**
**
X
lrot(X)
--->
Y
**
/ \
/ \
**
A
Y
<--rrot(Y)
X
C
**
/ \
/ \
**
B
C
A
B
** Se asume que x o y no son nulos
*/
void lrot(pnodo * raiz, pnodo x)
{ pnodo y;
//assert(x!=NULL);
//assert(x->right!=NULL);
y=x->right; /* y es el hijo derecho de x */
/* Pega subrbol izquierdo de y, como subrbol derecho de x.*/
x->right = y->left;
/* Si B no es nulo, el padre de B ahora es x */
if (y->left != NULL) y->left->padre = x;
/* Padre de y es el padre de x */
y->padre = x->padre;
if (x->padre == NULL) *raiz=y; /* Si x es la raz, la deja apuntando a y */
/* Si x era descendiente izquierdo, pega y por la izquierda */
else if (x == x->padre->left) {x->padre->left=y;}
else {x->padre->right=y;} //sino por la derecha
y->left=x; /* Al nodo y le pega x */
x->padre = y; /* Le pega el padre a x */
}

Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

15

12.5.6. Rotacin a la izquierda.


Es el cdigo especular del anterior.
/*
** Rotacin derecha con padre
**
**
X
rrot(X)
**
/ \
**
Y
C
<--**
/ \
**
A
B
**
**
** Se asume que x o y no son nulos
*/

--->
lrot(Y)

Y
/ \
A
X
/ \
B
C

void rrot(pnodo * raiz, pnodo x)


{ pnodo y;
//assert(x!=NULL);
//assert(x->left!=NULL);
y=x->left; /* y es el hijo izquierdo de x */
/* Pega subrbol derecho de y, como subrbol izquierdo de x.*/
x->left = y->right;
/* Si B no es nulo, el padre de B ahora es x */
if (y->right != NULL) y->right->padre = x;
/* Padre de y es el padre de x */
y->padre = x->padre;
if (x->padre == NULL)
*raiz=y;/* Si x es la raz, la deja apuntando a y */
/* Si x era descendiente derecho, pega y por la derecha */
else if (x == x->padre->right) {x->padre->right=y;} else {x->padre->left=y;}
y->right=x; /* Al nodo y le pega x */
x->padre = y; /* Le pega el padre a x */
}
12.5.7. Comenta errores en insercin y descarte.
void Error(int tipo, int clave)
{
if (tipo==1)
printf("Error en insercin. No se pudo crear Nodo\n");
else if (tipo==2)
Profesor Leopoldo Silva Bijit

26-05-2008

16

Estructuras de Datos y Algoritmos

printf("Error en insercin. Clave duplicada=%d!\n", clave);


else if (tipo==3)
printf("Error en descarte. Clave no encontrada!\n");
else printf("Error en tipo=%d!\n", tipo);
}
12.5.8. Calcula altura negra.
//revisa que se cumpla largos de negros de subrboles iguales, de cada nodo.
//Retorna -1 si hay error; sino entrega la altura negra, la funcin black height, bh(x).
int bh(pnodo x)
{
int nleft, nright;
if (x==NULL) return(1); //cuenta el descendiente de hoja como negro.
nleft=bh(x->left);
nright=bh(x->right);
//si hay error al retornar de los llamados recursivos
if (nleft==-1 || nright==-1) return(-1); //propaga el error
if (nleft != nright)
{
printf("Negros del izquierdo=%d difieren de los del derecho=%d, clave=%d\n",
nleft, nright, x->clave);
return(-1);
}
if (x->color == BLACK)
{
nleft++; //acumula los negros en nleft
}
return(nleft);
}
12.5.9. Revisa propiedades de rbol coloreado.
int RevisaPropiedades(pnodo x)
{ int bhl=1,bhr=1;
if (x==NULL) {printf("rbol vaco\n"); return (1);}
if (x->left==NULL && x->right==NULL)
{
if(x->color!=BLACK) printf("Raz no es negra\n"); return(1);
}
if (x->left!=NULL && x->right==NULL)
if(x->color!=BLACK && x->left->color!=RED)
{
printf("Nodo con solo hijo izquierdo no es negro ni tiene hijo rojo\n"); return(1);
Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

17

}
if (x->right!=NULL && x->left==NULL)
if(x->color!=BLACK && x->right->color!=RED)
{
printf("Nodo con solo hijo derecho no es negro ni tiene hijo rojo\n"); return(1);
}
if (x->color==RED)
{ //revisar
if (x->left->color!=BLACK && x->right->color!=BLACK)
{
printf("Rojo con dos hijos que no son negros, x=%d\n", x->clave); return(1);
}
}
if (x->left != NULL)
{
if (x->left->padre != x)
{
printf("Hijo izquierdo de x no apunta al padre, x=%d", x->clave);
return(1);
}
bhl=bh(x->left);
if (bhl==-1)
{ printf("Subrbol izquierdo no es coloreado\n");
return(1);
}
}
if (x->right != NULL)
{
if (x->right->padre != x)
{
printf("Hijo derecho de x no apunta al padre, x=%d", x->clave);
return(1);
}
bhr=bh(x->right);
if (bhr==-1)
{ printf("Subrbol derecho no es coloreado\n");
return(1);
}
}
if(bhl!=bhr)
{
printf("Arbol no es coloreado. l=%d r=%d\n",bhl,bhr);
return(1);
}
return(0); //si cumple propiedades.
}
Profesor Leopoldo Silva Bijit

26-05-2008

18

Estructuras de Datos y Algoritmos

12.6. Insercin.
La codificacin resulta sencilla si se ha efectuado previamente el anlisis detallado de los
diferentes casos, desarrollado en 12.3.
Se pasa por referencia el rbol.
pnodo insertar(pnodo *tree, pnodo nuevo)
{
pnodo y=NULL;
pnodo x=*tree;
if (nuevo==NULL) {Error(1,0); return (NULL);}
//Busca posicin para insertar.
while(x!=NULL)
{ y = x;
if (nuevo->clave < x->clave) x=x->left;
else if (nuevo->clave > x->clave) x=x->right;
else {Error(2, nuevo->clave); return(NULL);}
}
//y apunta al padre del lugar de insercin.

//malloc no pudo crear nodo

//clave duplicada

nuevo->padre=y;
if (y == NULL) {*tree=nuevo; nuevo->color=BLACK; return(nuevo);}
else if (nuevo->clave < y->clave) y->left=nuevo;
else y->right=nuevo;
/*Cdigo adicional para preservar las propiedades de rbol coloreado*/
x=nuevo;
while ( (x->padre!=NULL) && ( x->padre->color==RED) ) //doble rojo
{ if ( x->padre==x->padre->padre->left) //como la raz es negra, existe el abuelo de x
//si x es descendiente izquierdo del abuelo.
{ y=x->padre->padre->right; // y apunta al to
if ((y!=NULL)&&(y->color==RED)) // solo recoloracin.
{ x->padre->color=BLACK;
y->color=BLACK; //pinta NEGRO al to y al padre
x->padre->padre->color=RED; //el abuelo que era negro, cambia de color
x=x->padre->padre; //debe seguir revisando ascendentemente
}
else //Debe reestructurarse mediante rotaciones. Si y es nulo o y apunta a negro.
{
if (x==x->padre->right) { x= x->padre; lrot(tree,x);}
x->padre->color=BLACK;
x->padre->padre->color=RED;
rrot(tree, x->padre->padre);
}
Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

19

}
else //Cdigo especular. Si x es descendiente derecho del abuelo.
{ y=x->padre->padre->left; // y apunta al to
if ((y!=NULL)&& (y->color==RED)) // solo recoloracin.
{ x->padre->color=BLACK;
y->color=BLACK; //pinta al to
x->padre->padre->color=RED; //el abuelo que era negro, cambia de color
x=x->padre->padre; //debe seguir revisando
}
else //Debe reestructurarse mediante rotaciones
{
if (x==x->padre->left) { x= x->padre; rrot(tree,x);}
x->padre->color=BLACK;
x->padre->padre->color=RED;
lrot(tree, x->padre->padre);
}
}
}
(*tree)->color=BLACK; //pinta la raz negra
return (nuevo);
}

12.7. Descarte.
Para marcar con x la raz de un subrbol, que disminuy su altura negra, se emplea un nodo
externo, de color negro, para almacenar un puntero al padre de ste, cuando el nodo que debe
ser descartado es negro y es una hoja. Se pasa como argumento, a la funcin que restaura las
propiedades de un rbol coloreado, en caso de descartar un nodo negro, si el nodo x es un
centinela (nodo externo); de esta forma antes de modificar el puntero x, se podr escribir el
valor nulo en el padre de x.
/* Descarta nodo z, liberando el espacio*/
//z no debe ser NULL
void descarta(pnodo *rootp, pnodo z)
{
nodo externo; int centinela=0;
pnodo x, y;
if(z==NULL) Error(3,0);
if (z->left == NULL || z->right == NULL) y=z; //un hijo u hoja
else y=sucesor(z);
//Si hay hijo rojo, lo pega; si es hoja: y->right es nulo, y tambin x.
if (y->left != NULL) x=y->left; else x=y->right;
if(y->color==BLACK)
{ //y es negro.
if (x==NULL) {centinela=1; x=&externo; x->color=BLACK;}
Profesor Leopoldo Silva Bijit

26-05-2008

20

Estructuras de Datos y Algoritmos


//y es hoja; x es nodo externo.
x->padre = y->padre; //si y tiene hijo rojo, o si y es hoja
}
if (y->padre == NULL)
{ if(centinela) *rootp=NULL; else *rootp=x;}
else if (y==y->padre->left) y->padre->left = x;
else y->padre->right = x;
if (y!=z) { z->clave =y->clave; }
if (y->color == BLACK) delete_fix(rootp, x, centinela);
free(y);

}
/* Reestablece propiedades rbol coloreado luego de un descarte */
void delete_fix(pnodo *rootp, pnodo x, int esexterno)
{
pnodo w;
while (x!=*rootp && x->color==BLACK)
{
if (x==x->padre->left) //x es descendiente izquierdo
{
w=x->padre->right; //w es el hermano
if (w->color==RED)
{
w->color=BLACK;
x->padre->color=RED;
lrot(rootp, x->padre);
w=x->padre->right;
}
//ahora el hermano es negro.
if ( (w->left==NULL || w->left->color==BLACK)
//nodo externo o interno
&& (w->right==NULL || w->right->color==BLACK) )
{
w->color=RED;//ambos sobrinos negros
if(esexterno)
{x->padre->left=NULL; esexterno=0;}
x=x->padre; //cambia x. Asciende un nivel y sigue balanceando.
}
else
{
//uno o ambos sobrinos son rojos
if (w->right==NULL || w->right->color == BLACK)
//externo o interno
Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

21
{

//sobrino derecho negro


w->left->color=BLACK;
w->color=RED;
rrot(rootp, w);
w=x->padre->right;

}
//ahora el sobrino derecho es rojo
w->color=x->padre->color;
x->padre->color = BLACK;
w->right->color = BLACK;
lrot(rootp, x->padre);
if(esexterno)
{x->padre->left=NULL; esexterno=0;}
x=*rootp; //lleva x a la raiz, se sale del lazo
}
}
else //cdigo especular del if
{
//x es descendiente derecho.
w=x->padre->left;
if (w->color==RED)
{
w->color=BLACK;
x->padre->color=RED;
rrot(rootp, x->padre);
w=x->padre->left;
}
if ( (w->right==NULL || w->right->color==BLACK)
&& (w->left==NULL || w->left->color==BLACK))
{
w->color=RED;
if(esexterno)
{x->padre->right=NULL; esexterno=0;}
x=x->padre;
}
else
{
if (w->left==NULL || w->left->color == BLACK)
{
w->right->color=BLACK;
w->color=RED;
lrot(rootp, w);
w=x->padre->left;
}
w->color=x->padre->color;
x->padre->color = BLACK;
Profesor Leopoldo Silva Bijit

26-05-2008

22

Estructuras de Datos y Algoritmos


w->left->color = BLACK;
rrot(rootp, x->padre);
if(esexterno)
{x->padre->right=NULL; esexterno=0;}
x=*rootp;
}
}

}
//Al salir del while: x es la raz o es rojo. Si es la raz la pinta negra.
x->color=BLACK; //corrige caso con un solo hijo rojo
}

12.8. Test de las operaciones.


La insercin ascendente, genera el rbol coloreado, que se muestra en la Figura 12.2.
#define N 14
pnodo arbol=NULL;
int main(void)
{ int i;
printf("Insertando ascendente\n");
for(i=1;i<=N;i++)
{insertar(&arbol, CreaNodo(i));
printf("%d->", i);
//prtinorder(arbol,0); putchar('\n');
RevisaPropiedades(arbol);}
printf("\nDescartando\n");
for(i=1;i<=N;i++)
{descarta(&arbol, buscar(&arbol,i ));
printf("%d",i);
RevisaPropiedades(arbol);
}
printf("Insertando descendente\n");
for(i=N;i>0;i--)
{insertar(&arbol, CreaNodo(i));
printf("%d->",i);
//prtinorder(arbol,0); putchar('\n');
RevisaPropiedades(arbol);
}
printf("\nDescartando\n");
for(i=N;i>0;i--)
{descarta(&arbol, buscar(&arbol,i ));
Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

23

printf("%d",i);
RevisaPropiedades(arbol);
}
return(0);
}

Profesor Leopoldo Silva Bijit

26-05-2008

24

Estructuras de Datos y Algoritmos

Referencias.
R. Bayer. Symmetric binary B-trees: Data structure and maintenance algorithms.
Acta Informatica 1:290-306, 1972.
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction
to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001.

Profesor Leopoldo Silva Bijit

26-05-2008

rboles coloreados

25

ndice general.
CAPTULO 12. .......................................................................................................................................... 1
RBOLES COLOREADOS. RED BLACK. ........................................................................................... 1
12.1. PROPIEDADES DE LOS RBOLES COLOREADOS. ................................................................................ 1
12.2. COMPLEJIDAD EN RBOLES COLOREADOS. ...................................................................................... 3
12.3. ANLISIS DE INSERCIN. ................................................................................................................. 4
12.3.1. Recoloracin. Cuando el to es rojo. ....................................................................................... 5
12.3.2. Rotaciones. Cuando el to es negro. ........................................................................................ 6
12.4. ANLISIS DE LA OPERACIN DESCARTAR......................................................................................... 7
12.4.1. Dos descendientes. .................................................................................................................. 7
12.4.2. Un descendiente. ..................................................................................................................... 8
12.4.3. El nodo a descartar es una hoja. Sin descendientes. ............................................................... 9
12.4.4. Balance de alturas negras en descarte. Caso doble negro. ................................................... 10
a) Hermano rojo. ............................................................................................................................................ 10
b) Hermano negro. ......................................................................................................................................... 10
b1) Sobrinos negros. ................................................................................................................................. 10
b2) Sobrino derecho negro, sobrino izquierdo rojo. .................................................................................. 11
b3) Sobrino derecho rojo, sobrino izquierdo negro. .................................................................................. 11

12.5. ESTRUCTURA DE DATOS Y FUNCIONES BSICAS. ............................................................................ 12


12.5.1. Estructura de datos. ............................................................................................................. 12
12.5.2. Crea un nodo para insercin. ................................................................................................ 12
12.5.3. Sucesor. ................................................................................................................................. 13
12.5.4. Predecesor. ............................................................................................................................ 13
12.5.5. Rotacin a la izquierda. ........................................................................................................ 14
12.5.6. Rotacin a la izquierda. ........................................................................................................ 15
12.5.7. Comenta errores en insercin y descarte. ............................................................................. 15
12.5.8. Calcula altura negra. ............................................................................................................ 16
12.5.9. Revisa propiedades de rbol coloreado. ............................................................................... 16
12.6. INSERCIN. .................................................................................................................................... 18
12.7. DESCARTE. .................................................................................................................................... 19
12.8. TEST DE LAS OPERACIONES. ........................................................................................................... 22
REFERENCIAS. ........................................................................................................................................ 24
NDICE GENERAL. ................................................................................................................................... 25
NDICE DE FIGURAS................................................................................................................................. 26

Profesor Leopoldo Silva Bijit

26-05-2008

26

Estructuras de Datos y Algoritmos

ndice de figuras.
FIGURA 12.1 RBOL DE BSQUEDA BINARIA COLOREADO. ...........................................................................1
FIGURA 12.1A RBOL COLOREADO CON ROJOS HORIZONTALES. ...................................................................2
FIGURA 12.2 TRAYECTOS EN PEOR CASO. .....................................................................................................2
FIGURA 12.2A. COMPARACIN DE COMPLEJIDADES. RED-BLACK, AVL, BALANCEADO. .............................4
FIGURA 12.3 DOBLES ROJOS EN INSERCIN. .................................................................................................5
FIGURA 12.4 RECOLORACIN EN INSERCIN. TO ROJO. ...............................................................................6
FIGURA 12.5 RECOLORACIN CON TO NEGRO, NO QUEDAN DOS ROJOS ADYACENTES..................................6
FIGURA 12.6 ROTACIN DERECHA, PRESERVA ALTURA NEGRAS...................................................................6
FIGURA 12.7. ROTACIN IZQUIERDA, PAR PADRE-X. .....................................................................................7
FIGURA 12.8. NODO SELECCIONADO PARA SER DESCARTADO ES HOJA ROJA. ...............................................8
FIGURA 12.9. NODO SELECCIONADO PARA SER DESCARTADO ES NODO NEGRO CON HIJO ROJO. ....................8
FIGURA 12.10 DESCARTAR NODO NEGRO CON UN HIJO ROJO. .......................................................................8
FIGURA 12.10A DESCARTAR NODO NEGRO CON UN HIJO ROJO. .....................................................................8
FIGURA 12.11 DESCARTAR HOJA. .................................................................................................................9
FIGURA 12.12 DESCARTAR HOJA NEGRA CON HERMANO ROJO. ....................................................................9
FIGURA 12.13 DESCARTAR HOJA NEGRA CON PADRE Y HERMANO NEGRO. ...................................................9
FIGURA 12.14 HERMANO ROJO, PADRE NEGRO. ..........................................................................................10
FIGURA 12.15 HERMANO NEGRO Y SOBRINOS NEGROS. ..............................................................................11
FIGURA 12.16 HERMANO Y SOBRINO DERECHO NEGROS. ............................................................................11
FIGURA 12.17 HERMANO NEGRO, SOBRINO DERECHO ROJO. .......................................................................11
FIGURA 12.18 HERMANO NEGRO, SOBRINOS ROJOS. ...................................................................................12

Profesor Leopoldo Silva Bijit

26-05-2008

You might also like