Professional Documents
Culture Documents
Captulo 12.
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
26-05-2008
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
26-05-2008
rboles coloreados
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:
bh( x)
h
2
n 2bh( x) 1 2h / 2 1
Despejando h, se logra:
h 2log(n 1)
(log(n))
26-05-2008
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
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
26-05-2008
abuelo
padre
to
to
abuelo
to
padre
to
to
padre
abuelo
to
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
26-05-2008
t
t
I D
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
26-05-2008
rboles coloreados
26-05-2008
10
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.
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
?
h
?
h
h
h
?
h
x
?
h
?
h
h
x
26-05-2008
12
?
h
26-05-2008
rboles coloreados
13
26-05-2008
14
26-05-2008
rboles coloreados
15
--->
lrot(Y)
Y
/ \
A
X
/ \
B
C
26-05-2008
16
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
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.
//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
}
/* 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
{
}
//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
}
//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
}
26-05-2008
rboles coloreados
23
printf("%d",i);
RevisaPropiedades(arbol);
}
return(0);
}
26-05-2008
24
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.
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
26-05-2008
26
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
26-05-2008