Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Arbol Rojo Negro
Arbol Rojo Negro
1) CONCEPTOS:
A. Un rbol rojo negro es un tipo abstracto de datos, concretamente es
un rbol binario de bsqueda equilibrado.
B. Un rbol binario de bsqueda auto- balanceable o equilibrado es
un rbol binario de bsqueda que intenta mantener su altura, o el
nmero de niveles de nodos bajo la raz, tan pequeos como sea
posible en todo momento.
C. Podemos recordar que: Los rboles AVL estn siempre equilibrados
de tal modo que para todos los nodos, la altura de la rama izquierda
no difiere en ms de una unidad de la altura de la rama derecha o
viceversa. Gracias a esta forma de equilibrio (o balanceo), la
complejidad de una bsqueda en uno de estos rboles se mantiene
siempre en orden de complejidad O(log n). esto permite que al
insertar o eliminar algn nodo, el rbol siga siendo balanceado o
equilibrado.
D. Un rbol binario de bsqueda es un rbol con una restriccin
adicional - que mantiene los elementos en el rbol en un orden
determinado. Oficialmente, cada nodo en el ABB tiene dos hijos (si
falta alguno consideramos que es un nodo cero) a la izquierda, un
nio y un nio de la derecha. Los nodos estn enraizados en el lugar
sobre la base de sus valores, con la ms pequea a la izquierda y el
ms grande de la derecha.
E. Un rbol rojo-negro es un rbol binario de bsqueda en el que cada
nodo almacena un bit adicional de informacin llamado color, el cual
puede ser rojo o negro. Sobre este atributo de color se aplican
restricciones que resultan en un rbol en el que ningn camino de la
raz a una hoja es ms de dos veces ms largo que cualquier otro, lo
cual significa que el rbol es balanceado.
F. Cada nodo de un rbol rojo negro contiene la siguiente informacin:
color, dato, hijo izquierdo, hijo derecho y padre. Si un hijo o el padre
de un nodo no existe, el apuntador correspondiente contiene el valor
NULO, el cual consideraremos como un nodo cuyo color es negro. En
lo sucesivo nos referiremos a los nodos distintos a las hojas (NULO)
1
como nodos internos del rbol y a las hojas y al padre de la raz como
nodos externos.
G. Es una representacin en rbol binario de un rbol 2-3-4.
H. rboles rojo-negro son una evolucin de los rboles binarios de
bsqueda que tienen como objetivo mantener el rbol balanceado sin
afectar a la complejidad de las operaciones primitivas. Esto se hace
mediante la coloracin de cada nodo en el rbol con rojo o negro y la
preservacin de un conjunto de propiedades que garantizan que el
ms profundo camino en el rbol no es ms largo que el doble de la
ms corta.
La estructura original fue creada por Rudolf Bayer en 1972, que le dio el
nombre de rboles-B binarios simtricos, pero tom su nombre moderno
en un trabajo de Leo J. Guibas y Robert Sedgewick realizado en 1978.
B) Terminologa:
El rbol rojo negro es un tipo especial de rbol binario, utilizado en
informtica para organizar informacin compuesta por datos comparables,
como son los nmeros.
C) Caractersticas y propiedades:
Todo nodo es o bien rojo o bien negro.
La raz es de color negra
Un nodo rojo puede tener solo hijos negros.
Todas las hojas son negras (las hojas son los hijos nulos).
Cada camino simple desde un nodo a un nodo hijo descendiente
contiene el mismo nmero de nodos negros, ya sea contando siempre
los nodos negros nulos o bien no contndolos nunca. Tambin es
llamada propiedad del camino y por tanto el camino no puede tener
dos rojos seguidos.
2
El camino largo desde la raz hasta una hoja no es ms largo que 2
veces el camino ms corto desde la raz del rbol hasta una hija en
dicho rbol. El resultado es que dicho rbol esta aproximadamente
equilibrado.
3
2) IMPORTANCIA DEL USO DE RBOLES ROJO NEGROS:
3. OPERACIONES
A. Rotacin.
B. Bsqueda (similar a los rboles binarios de bsqueda. Los colores de
los hijos no se usan)
C. Insercin (se utilizarn las transformaciones de los 4-nodos descritas
para los rboles 2-3-4)
D. Eliminacin
4
Las operaciones que veremos a continuacin son las que se aplican de una
forma particular a los arboles rojo negros; sin embargo las operaciones de
lectura (las ms simples), son las mismas que en los arboles binarios de
bsqueda y no tienen alteracin; ya que recordemos que los arboles rojo
negros son arboles ABB; por lo tanto no se tendrn en cuenta en este texto.
A) ROTACIN:
Para conservar las propiedades que debe cumplir todo rbol rojo-
negro, en ciertos casos de la insercin y la eliminacin ser necesario
reestructurar el rbol, si bien no debe perderse la ordenacin relativa
de los nodos. Para ello, se llevan a cabo una o varias rotaciones, que
no son ms que reestructuraciones en las relaciones padre-hijo-to-
nieto.
Las rotaciones que se consideran a continuacin son simples; sin
embargo, tambin se dan las rotaciones dobles.
5
En las imgenes pueden verse de forma simplificada cmo se llevan a
cabo las rotaciones simples hacia la izquierda y hacia la derecha en
cualquier rbol binario de bsqueda, en particular en cualquier rbol
rojo-negro. Podemos ver tambin la implementacin en C de dichas
operaciones.
aux = p;
p = p->dcho;
p->izdo = aux;
//reenraizar subarbol
6
if(aux->padre->izdo == aux)
aux->padre->izdo = p;
else {
aux->padre->dcho = p;
p->padre = aux->padre;
aux->padre = p;
7
void
rotar_dcha(struct node *p)
{
struct node *aux;
aux = p;
p = p->izdo;
aux->izdo = p->dcho;
p->dcho = aux;
// reenraizar subarbol
if(aux->padre->izdo == aux)
aux->padre->izdo = p;
else {
// aqui aux->padre->dcho == aux
aux->padre->dcho = p;
}
// actualizar los padres de los nodos modificados
p->padre = aux->padre;
aux->padre = p;
aux->izdo->padre = aux; // No hacer si usamos una sola hoja nula y
aux->izdo es nulo
}
B) BSQUEDA
La bsqueda consiste acceder a la raz del rbol, si el elemento a
localizar coincide con ste la bsqueda ha concluido con xito, si
el elemento es menor se busca en el subrbol izquierdo y si es mayor
se buscar en el derecho. Si llegamos a un nodo hoja y el elemento
no ha sido encontrado se supone que no existe en el rbol. Cabe
destacar que la bsqueda en este tipo de rboles es muy
eficiente, representa una funcin logartmica.
NOTA PARA RECORDAR: La bsqueda de un elemento en
un ABB (rbol Binario de Bsqueda) en general, y en un rbol
rojo negro en particular, se puede realizar de dos formas,
iterativa o recursiva.
8
Ejemplo de versin iterativa en el lenguaje de programacin C,
suponiendo que estamos buscando una clave alojada en un nodo
donde est el correspondiente "dato" que precisamos encontrar:
data Buscar_ABB(abb t,clave k)
{
abb p;
dato e;
e=NULL;
p=t;
if (!estaVacio(p))
{
while (!estaVacio(p) && (p->k!=k) )
{
if (k < p->k)
{
p=p->l;
}
if (p->k < k)
{
p=p->r;
}
}
if (!estaVacio(p) &&(p->d!=NULL) )
{
e=copiaDato(p->d);
}
}
9
return e;
}
Vase ahora la versin recursiva en ese mismo lenguaje:
int buscar(tArbol *a, int elem)
{
if (a == NULL)
return 0;
else if (a->clave < elem)
return buscar(a->hDerecho, elem);
else if (a->clave > elem)
return buscar(a->hIzquierdo, elem);
else
return 1;
}
C) INSERCIN:
La insercin comienza aadiendo el nodo como lo haramos en
un rbol binario de bsqueda convencional y pintndolo de rojo. Lo
que sucede despus depende del color de otros nodos cercanos.
El trmino to nodo ser usado para referenciar al hermano del padre
de un nodo, como en los rboles familiares humanos. Conviene notar
que:
10
La propiedad Ambos hijos de cada nodo rojo son negros est
amenazada solo por aadir un nodo rojo, por repintar un nodo negro
de color rojo o por una rotacin.
La propiedad Todos los caminos desde un nodo dado hasta sus
nodos hojas contiene el mismo nmero de nodos negros est
amenazada solo por repintar un nodo negro de color rojo o por una
rotacin.
Al contrario de lo que sucede en otros rboles como puede ser
el rbol AVL, en cada insercin se realiza un mximo de una rotacin,
ya sea simple o doble. Por otra parte, se asegura un tiempo de
recoloracin mximo de por cada insercin.
NOTA IMPORTANTE: En los esquemas que acompaan a los
algoritmos, la etiqueta N ser utilizada por el nodo que est
siendo insertado, P para los padres del nodo N, G para los
abuelos del nodo N, y U para los tos del nodo N. Notamos que
los roles y etiquetas de los nodos estn intercambiados entre
algunos casos, pero en cada caso, toda etiqueta contina
representando el mismo nodo que representaba al comienzo del
caso. Cualquier color mostrado en el diagrama est o bien
supuesto en el caso o implicado por dichas suposiciones.
11
struct node * tio(struct node *n)
{
struct node *a = abuelo(n);
if (n->padre == a->izdo)
return a->dcho;
else
return a->izdo;
}
Estudiemos ahora cada caso de entre los posibles que nos podemos
encontrar al insertar un nuevo nodo.
Caso 1: El nuevo nodo N es la raz de del rbol. En este caso, es
repintado a color negro para satisfacer la propiedad (la raz es negra).
Como esto aade un nodo negro a cada camino, la propiedad todos los
caminos desde un nodo dado a sus hojas contiene el mismo nmero de
nodos negros se mantiene. En C quedara as:
Caso 3: Si
el padre
P y el to U son rojos, entonces ambos nodos pueden ser
repintados de negro y el abuelo G se convierte en rojo para
mantener la propiedad todos los caminos desde cualquier nodo
dado hasta sus hojas contiene el mismo nmero de nodos
negros. Ahora, el nuevo nodo rojo N tiene un padre negro.
Como cualquier camino a travs del padre o el to debe pasar a
travs del abuelo, el nmero de nodos negros en esos caminos
no ha cambiado. Sin embargo, el abuelo G podra ahora violar la
propiedad la raz es negra o la de ambos hijos de cada nodo
13
rojo son negros, en este caso porque G podra tener un padre
rojo. Para solucionar este problema, el procedimiento completo
se realizar de forma recursiva hacia arriba hasta alcanzar el
caso 1. El cdigo en C quedara de la siguiente forma:
14
Caso 4: El nodo padre P es rojo pero el to U es negro; tambin, el
nuevo nodo N es el hijo derecho de P, y P es el hijo izquierdo de su
padre G. En este caso, una rotacin a la izquierda que cambia los
roles del nuevo nodo N y su padre P puede ser realizada; entonces, el
primer nodo padre P se ve implicado al usar el caso 5 de insercin
(reetiquetando N y P ) debido a que la propiedad ambos hijos de
cada nodo rojo son negros se mantiene an incumplida. La rotacin
causa que algunos caminos (en el sub-rbol etiquetado como 1)
pasen a travs del nuevo nodo donde no lo hacan antes, pero ambos
nodos son rojos, as que la propiedad todos los caminos desde
cualquier nodo dado a sus hojas contiene el mismo nmero de nodos
negros no es violada por la rotacin. Aqu tenemos una posible
implementacin:
15
} else if ((n == n->padre->izdo) && (n->padre == a->dcho)) {
rotar_dcha(n->padre);
n = n->dcho;
}
insercion_caso5(n);
}
16
Void insercion_caso5(struct node *n)
{
struct node *a = abuelo(n);
n->padre->color = NEGRO;
a->color = ROJO;
if ((n == n->padre->izdo) && (n->padre == a->izdo)) {
rotar_dcha(a);
} else {
/*
* En este caso, (n == n->padre->dcho) && (n->padre ==
a->dcho).
*/
rotar_izda(a);
}
}
17
es el nodo que queramos originalmente borrar o el nodo del que
copiamos el valor.
Si borramos un nodo rojo, podemos simplemente reemplazarlo con su
hijo, que debe ser negro. Todos los caminos hasta el nodo borrado
simplemente pasarn a travs de un nodo rojo menos, y ambos
nodos, el padre del borrado y el hijo, han de ser negros, as que las
propiedades como todas las hojas, incluyendo las nulas, son negras
y los dos hijos de cada nodo rojo son negros se mantienen. Otro
caso simple es cuando el nodo borrado es negro y su hijo es rojo.
Simplemente eliminar un nodo negro podra romper las
propiedades los dos hijos de cada nodo rojo son negros y
todos los caminos desde un nodo dado hasta sus hojas
contienen el mismo nmero de nodos negros, pero si
repintamos su hijo de negro, ambas propiedades quedan
preservadas.
El caso complejo es cuando el nodo que va a ser borrado y su hijo
son negros. Empezamos por reemplazar el nodo que va a ser borrado
con su hijo. Llamaremos a este hijo (en su nueva posicin) N, y su
hermano (el otro hijo de su nuevo padre) S. En los diagramas de
debajo, usaremos P para el nuevo padre de N, SL para el hijo
izquierdo de S, y SR para el nuevo hijo derecho de S (se puede
mostrar que S no puede ser una hoja).
NOTA IMPORTANTE: Entre algunos casos cambiamos roles y
etiquetas de los nodos, pero en cada caso, toda etiqueta sigue
representando al mismo nodo que representaba al comienzo del
caso. Cualquier color mostrado en el diagrama es o bien
supuesto en su caso o bien implicado por dichas suposiciones.
El blanco representa un color desconocido (o bien rojo o bien
negro).
El cumplimiento de estas reglas en un rbol con n nodos,
asegura un mximo de tres rotaciones y
hasta recoloraciones.
struct node *
hermano(struct node *n)
{
18
if (n == n->padre->izdo)
return n->padre->dcho;
else
return n->padre->izdo;
}
Nota: Con el fin de preservar la buena definicin del rbol,
necesitamos que toda hoja nula siga siendo una hoja nula tras
todas las transformaciones (que toda hoja nula no tendr ningn
hijo). Si el nodo que estamos borrando tiene un hijo no hoja N, es
fcil ver que la propiedad se satisface. Si, por otra parte N fuese
una hoja nula, se verifica por los diagramas o el cdigo que para
todos los casos la propiedad se satisface tambin.
reemplazar_nodo(n, hijo);
if (n->color == NEGRO) {
if (hijo->color == ROJO)
hijo->color = NEGRO;
19
else
eliminar_caso1(hijo);
}
free(n);
}
NOTA IMPORTANTE: Si N es una hoja nula y no queremos
representar hojas nulas como nodos reales, podemos modificar
el algoritmo llamando primero a eliminar_caso1() en su padre (el
nodo que borramos, n en el cdigo anterior) y borrndolo
despus. Podemos hacer esto porque el padre es negro, as que
se comporta de la misma forma que una hoja nula (y a veces es
llamada hoja fantasma). Y podemos borrarla con seguridad, de
tal forma que n seguir siendo una hoja tras todas las
operaciones, como se muestra arriba.
20
NOTA IMPORTANTE: En los casos 2, 5 y 6, asumimos que N es el
hijo izquierdo de su padre P. Si ste fuese el hijo derecho, la
izquierda y la derecha deberan ser invertidas en todos estos
casos. De nuevo, el cdigo del ejemplo toma ambos casos en
cuenta.
Caso 2: S es rojo. En este caso invertimos los colores de P y S, por lo
que rotamos a la izquierda P, pasando S a ser el abuelo de N. Ntese
que P tiene que ser negro al tener un hijo rojo. Aunque todos los
caminos tienen todava el mismo nmero de nodos negros, ahora N
tiene un hermano negro y un padre rojo, as que podemos proceder a
al paso 4, 5 o 6 (este nuevo hermano es negro porque ste era uno
de los hijos de S, que es rojo). En casos posteriores, re etiquetaremos
el nuevo hermano de N como S. Aqu podemos ver una
implementacin:
21
if (hm->color == ROJO) {
n->padre->color = ROJO;
hm->color = NEGRO;
if (n == n->padre->izdo)
rotar_izda(n->padre);
else
rotar_dcha(n->padre);
eliminar_caso3(n);
22
void eliminar_caso3(struct node *n)
(hm->dcho->color == NEGRO)) {
hm->color = ROJO;
eliminar_caso1(n->padre);
} else
eliminar_caso4(n);
23
Void eliminar_caso4(struct node *n)
(hm->dcho->color == NEGRO)) {
hm->color = ROJO;
n->padre->color = NEGRO;
} else
eliminar_caso5(n);
24
Void eliminar_caso5(struct node *n)
(hm->dcho->color == NEGRO)) {
hm->color = ROJO;
hm->izdo->color = NEGRO;
rotar_dcha(hm);
(hm->izdo->color == NEGRO)) {
hm->color = ROJO;
hm->dcho->color = NEGRO;
rotar_izda(hm);
eliminar_caso6(n);}
25
De nuevo, todas las llamadas de la funcin usan recursin de cola as
que el algoritmo realiza sus operaciones sobre el propio rbol.
Adems, las llamadas no recursivas se harn despus de una
rotacin, luego se harn un nmero de rotaciones (ms de 3) que
ser constante.
4) DEMOSTRACION DE COTAS
Caso base: h(v)=0 Si v tiene altura cero entonces debe ser rbol
vaco, por tanto bh(v)=0. Luego:
H
Hiptesis de Induccin: si v es tal que h(v) = k y
contiene nodos internos, veamos que esto implica
que tal que h( ) = k+1 contiene nodos internos.
Si tiene h( ) > 0 entonces es un nodo interno. Como ste tiene dos
hijos que tienen altura-negra, o bh( ) o bh( )-1 (dependiendo si es
rojo o negro). Por la hiptesis de induccin cada hijo tiene al
menos nodos internos, as que tiene :
nodos
internos.
26
Usando este lema podemos mostrar que la altura del rbol es
algortmica. Puesto que al menos la mitad de los nodos en cualquier
camino desde la raz hasta una hoja negra (propiedad 4 de un rbol
rojo-negro), la altura-negra de la raz es al menos h(raz)/2. Por el
lema tenemos que:
27