Académique Documents
Professionnel Documents
Culture Documents
INGENIERA SISTEMAS LABORATORIO DE ALGORITMIA Y ESTRUCTURA DE DATOS I RBOLES ROJINEGROS (RED BLACK TREE) I OBJETIVOS Explicar el TAD rbol Rojo Negro Implementar el TAD rbol Rojo Negro. Utilizar el TAD rbol Rojo Negro para la resolucin de problemas. II TEMAS TAD rbol Rojo Negro Insercin, eliminacin en un rbol Rojo Negro III MARCO TERICO PARA QU SIRVEN? Son una clase de rboles binarios de bsqueda equilibrados (altura mxima logartmica en el nmero de nodos) para garantizar coste O(log n) de las operaciones bsicas del TAD diccionario. ltimamente, por alguna razn que veremos, han estado ms de moda que los rboles AVL.
RBOL ROJO NEGRO: DEFINICIN rbol binario de bsqueda con un bit adicional en cada nodo, su color, que puede ser rojo o negro. Ciertas condiciones sobre los colores de los nodos garantizan que la profundidad de ninguna hoja es ms del doble que la de ninguna otra (el rbol est algo equilibrado). Cada nodo es un registro con: color (rojo o negro), clave (la clave de bsqueda), y tres punteros a los hijos (i, d) y al padre (p). Si los punteros son NIL, imaginaremos que son punteros a nodos externos (hojas).
Condiciones rojinegras: RN1 - Cada nodo es rojo o negro. RN2 - Toda hoja (NIL) es negra. RN3 - Si un nodo es rojo, sus dos hijos son negros.
RBOL ROJO NEGRO: TERMINOLOGA
RN4 - Todo camino desde un nodo a cualquier hoja descendente contiene el mismo nmero de nodos negros.
Terminologa: Altura negra de un nodo x, an(x): es el nmero de nodos negros desde x (sin incluir
x) hasta cualquier hoja descendente de x. Altura negra de un rbol: la altura negra de su raz.
Lema
Todo rbol rojinegro con n nodos internos tiene una altura menor o igual que 2 log(n+1). Las operaciones de bsqueda pueden implementarse en tiempo O(log n) para rboles rojinegros con n nodos. Veremos a continuacin que tambin pueden realizarse en tiempo O(log n) sin que el rbol deje de ser rojinegro.
Y la insercin y el borrado?
RBOL ROJO NEGRO: INSERTAR
Al insertar nuevos elementos en rboles rojinegros, en tiempo O(log n), se debe garantizar que el rbol resultante contine siendo rojinegro En los rboles rojinegros las hojas son vacas y negras Los nuevos elementos se colocan como padres de hojas Cada nuevo elemento se coloca como una estructura del rbol binario Como las hojas deben ser negras, el nodo que contiene la llave a insertarse se colorea como
rojo
No se aumenta la altura negra del rbol La nica propiedad que puede violarse es la referente insertado RBOL ROJO NEGRO: PATRONES DE AJUSTE
Los tres patrones de ajuste que pueden ser necesarios despus de la insercin de un nodo V en un rbol rojo negro. Los ajustes slo sern necesarios cuando P es rojo. PATRN 1 Cuando U es rojo solo se necesita una recoloracin. Esto puede propagarse hacia arriba en el rbol, produciendo rotaciones y/o recoloraciones adicionales.
NIL
NIL
NIL
NIL
PATRN 2 Si U es negro y V es un hijo izquierdo aplicamos una operacin rotar-derecha (g) (en el centro) seguida de una recoloracin (derecha). Esto detendr la propagacin.
G U V
P G U V
P G U
P S
NIL
NIL
NIL
NIL
NIL
NIL
PATRN 3 Si U es negro y V es un hijo derecho aplicamos una doble rotacin consistente de una operacin rotar-izquierda (p) seguida de rotar-derecha (g) (en el centro) y entonces una recoleccin (derecha). Esto tambin detendr la propagacin.
G U
V P P
G U
G U
S
NIL
V
NIL
NIL
NIL
NIL
NIL
RBOL ROJO NEGRO: EJEMPLO DE INSERCIN Generar el rbol Rojo Negro con la siguiente secuencia de datos:
10
NIL
P V 5
10
NIL
NIL
NIL
NIL
2 Insertar 1
G P 5
10
NIL
P V 1
NIL
5 G U
10
NIL
1
NIL
NIL
NIL
NIL
NIL
3 Insertar 2
G P 1 V 2
5 U P
G 10
NIL
5 U
1 V 2
NIL
10
NIL
NIL
NIL
NIL
NIL
NIL
NIL
NIL
4 Insertar 15
G U 1 2
NIL
5 P V 15
NIL NIL
10
NIL
NIL
NIL
5 Insertar 18
5 1
NIL
5 10 G P V 18
NIL NIL
1
NIL
15 2 G 10
NIL
2
NIL
NIL
U
NIL
15
18
NIL
NIL
NIL
NIL
NIL
NIL
6 Insertar 3
5 G 1 2
NIL
15 P V 10
NIL
18
NIL NIL NIL
3
NIL
NIL
NIL
5 2 G 1 U
NIL NIL NIL
P 10
15
V
NIL NIL
18
NIL NIL NIL
7 Insertar 20
5 2 U 10 15 G 18
1
NIL NIL NIL
3
NIL
P 20 V
NIL
NIL
NIL
NIL
NIL
5 2 U 10 15 G 18
1
NIL NIL NIL
3
NIL
P 20 V
NIL
NIL
NIL
NIL
NIL
8 Insertar 40
5 2 10 U 15 18 G P V
1
NIL NIL NIL
3
NIL NIL
NIL
NIL
20
NIL NIL
40
NIL
5 2 10 G
NIL NIL NIL NIL NIL NIL
15 20 P
18
NIL NIL
40
NIL
NIL
PROPUESTOS
Elabore el rbol rojo negro de la siguiente secuencia de datos:
1. 10, 13, 15, 50, 30, 40, 60, 25, 28 2. 100, 190, 120, 205, 115, 148, 230, 262, 174
Sin embargo, es necesario mantener la estructura de los rboles rojinegros Para evitar repeticiones se introduce viga, nil(A), el cual representa las hojas del rbol rojinegro Si el nodo suprimido y fuese rojo, entonces, las alturas negras no cambian y, en tal caso, termina Si el nodo suprimido y fuese negro, entonces, las ramas que pasen por y tienen un nodo negro menos, lo que viola la condicin de los rboles rojinegros. En este caso es necesario ajustar colores. RBOL ROJO NEGRO: PATRONES DE AJUSTE Los cuatro patrones de ajuste que pueden ser necesarios despus de la eliminacin de un nodo U de un rbol rojo negro. El nodo que sustituye a U est etiquetado con V. Los ajustes solo son necesarios si V es un nodo negro distinto de la raz. PATRN 1 Si S es rojo, con una operacin rotar izquierda (P) (en el centro), seguida de la recoloracin mostrada en la derecha, este caso se transforma en uno de los otros tres casos.
P V+
NIL NIL
S NL NR
P V
+
S NR
NL
NIL
NIL
NIL
NIL
NIL
P V
+
S NR
NL
NIL
NIL
NIL
NIL
NIL
NIL
10
PATRN 2 Si S y sus dos hijos son negros, slo se necesita una recoloracin. Esto se puede propagar hacia arriba en el rbol.
P V+
NIL NIL
P S NL NR V
NIL NIL
S NL NR
NIL
NIL
NIL
NIL
NIL
NIL
NIL
NIL
PATRN 3 Si S es negro y su hijo derecho es rojo aplicamos una operacin rotar izquierda (P) (en el centro), seguida de la recoloracin mostrada a la derecha. Esto restablece la regla del negro en el rbol.
P V+
NIL NIL
S NL NR
P V NL
S NR
NIL
NIL
NIL
NIL
NIL
P V NL
S NR
NIL
11
PATRN 4 Si S y su hijo derecho son negros, y su hijo izquierdo es rojo, aplicamos una operacin de Rotar derecha (S) (en el centro) seguida de la recoloracin mostrada a la derecha. Este caso se transforma en el mostrado en el patrn 3.
P V
+
P S NL NR V
+
NL S
NIL NIL NIL
NIL
NIL
NIL
NR
NIL
NIL
NIL
NIL
NIL
NIL
P V
+
NL S
NIL NIL NIL NIL
NIL
NR
NIL
12
RBOL ROJO NEGRO: EJEMPLOS DE ELIMINACIN EJEMPLO 1 Eliminar el 3 del siguiente rbol rojo negro.
5 2 10 15 20
1
NIL NIL NIL
3
NIL NIL
NIL
18
NIL NIL NIL
40
NIL
SOLUCIN
5 2
NIL
15 10 G 20 P
1
NIL NIL
NIL
NIL
18
NIL NIL
40
NIL
NIL
13
5 2 10 15 20
1
NIL NIL NIL
3
NIL NIL
NIL
18
NIL NIL NIL
40
NIL
SOLUCIN
5 1 10 15 20
NIL
3
NIL NIL NIL
NIL
18
NIL NIL NIL
40
NIL
14
5 2 10 15 20
1
NIL NIL NIL
3
NIL NIL
NIL
18
NIL NIL NIL
40
NIL
5 2 V+
NIL
10
P S
1
NIL NIL NIL
3
NIL
20 NL
18
NIL NIL
40
NR
NIL
NIL
15
2 Rotamos a la izquierda
5 2 P 1
NIL NIL NIL
20
3
NIL
10 NL
NIL
40
NR
NIL
18
NIL
NIL
NIL
Como V tiene ahora un antepasado negro adicional en este subrbol, la unidad extra de color negro ha sido absorbida 3 Aplicamos recoloracin
5 2 P 1
NIL NIL NIL
20
3
NIL
10 NL
NIL
40
NR
NIL
18
NIL
NIL
NIL
16
EJEMPLO 4 Eliminar el
1
NIL NIL NIL
3
NIL NIL
NIL
18
NIL NIL NIL
40
NIL
3 2 S P 10
NIL
1
NIL
NIL
20
NL
NIL
NR
18
NIL NIL NIL
40
NIL
17
2 Eliminando 3
2 V+ 1 NR
P 10 S
NL
NIL
NIL
NIL
20
18
NIL NIL NIL
40
NIL
2 V 1 NR
P 10 S
NL
NIL
NIL
NIL
20
18
NIL NIL NIL
40
NIL
18
PROPUESTOS Dado el siguiente rbol rojo negro 1 Eliminar el nodo con valor 20 2 Eliminar el nodo con valor 4 3 Eliminar el nodo con valor 9
9 4 2 1
NIL NIL NIL
16 6 10 20
3
NIL NIL
5
NIL NIL
7 8
NIL
NIL
18
NIL NIL
40
NIL
NIL
NIL
NIL
19
red-black.h
typedef int A; class ArbolRN{ private: class NodoRN{ public: A clave; NodoRN *der, *izq, *pad; int color;
NodoRN(A ele,NodoRN*padre=NULL){
clave=ele; izq=der=NULL; pad=padre; color=1;//rojo
} void show(){ cout<<clave<<"\t"<<color<<"\t"; (pad)?cout<<pad->clave:cout<<"NULL";cout<<"\n"; } }; NodoRN *Raiz; public: ArbolRN(){Raiz=NULL;} void showTree(NodoRN*root=NULL,bool r=true); void insertar_rn(A ele); void busqueda(A ele); protected: void rotacion_der(NodoRN*); void rotacion_izq(NodoRN*); NodoRN* insertar_abb(NodoRN**,NodoRN*,A); void restaurar_color(NodoRN*); NodoRN* busqueda_rn(NodoRN**,A); }; ArbolRN::NodoRN* ArbolRN::insertar_abb(NodoRN **root,NodoRN *padre,A ele) { if(!(*root)){ *root=new NodoRN(ele,padre); return (*root); } else if (ele <(*root)->clave) insertar_abb(&((*root)->izq),(*root),ele); else if (ele>(*root)->clave) insertar_abb(&((*root)->der),(*root),ele); else{
20
cout<<"No puede haber claves repetidas"; } } void ArbolRN::rotacion_izq(NodoRN*nodo) { NodoRN*aux=NULL; aux=nodo->der; nodo->der=aux->izq; if(aux->izq!=NULL) aux->izq->pad=nodo; aux->pad=nodo->pad; if(nodo->pad==NULL) Raiz=aux; else { if(nodo==nodo->pad->izq) nodo->pad->izq=aux; else nodo->pad->der=aux; } aux->izq=nodo; nodo->pad=aux; } void ArbolRN::rotacion_der(NodoRN*nodo) { NodoRN*aux=NULL; aux=nodo->izq; nodo->izq=aux->der; if(aux->der!=NULL) aux->der->pad=nodo; aux->pad=nodo->pad; if(aux->pad==NULL) Raiz=aux; else { if(nodo==nodo->pad->der) nodo->pad->der=aux; else nodo->pad->izq=aux; } aux->der=nodo; nodo->pad=aux; } void ArbolRN::insertar_rn(A ele){ NodoRN *x=insertar_abb(&Raiz,0,ele); restaurar_color(x); } void ArbolRN::busqueda(A ele){ NodoRN *pNode=busqueda_rn(&Raiz,ele); if(!pNode) cout<<"No esta el elemento"; else cout<<"elemento si esta"; } ArbolRN::NodoRN* ArbolRN::busqueda_rn(NodoRN** root, A ele){
Mgter. Juan Pablo Apaza Condori
21
if(!(*root)){ cout<<"No se encontro elemento"; return 0; } else if (ele <(*root)->clave) busqueda_rn(&((*root)->izq),ele); else if (ele>(*root)->clave) busqueda_rn(&((*root)->der),ele); else return (*root); } void ArbolRN::restaurar_color(NodoRN*nodo) { NodoRN*aux=NULL; while(nodo!=Raiz && nodo->pad->color==1) { if(nodo->pad==nodo->pad->pad->izq){ aux=nodo->pad->pad->der; if(aux && aux->color==1) { nodo->pad->color=0; aux->color=0; nodo->pad->pad->color=1; nodo=nodo->pad->pad; } else{ if(nodo==nodo->pad->der){ nodo=nodo->pad; rotacion_izq(nodo); } nodo->pad->color=0; nodo->pad->pad->color=1; rotacion_der(nodo->pad->pad); } } else{ aux=nodo->pad->pad->izq; if(aux && aux->color==1) { nodo->pad->color=0; aux->color=0; nodo->pad->pad->color=1; nodo=nodo->pad->pad; } else{ if(nodo==nodo->pad->izq){ nodo=nodo->pad; rotacion_der(nodo); } nodo->pad->color=0; nodo->pad->pad->color=1; rotacion_izq(nodo->pad->pad); } } } Raiz->color=0; }
Mgter. Juan Pablo Apaza Condori
22
void ArbolRN::showTree(NodoRN* root,bool r){ if(r) root=Raiz; if(!root) return; showTree(root->izq,false); root->show(); showTree(root->der,false); }
red-black.cpp
#include<iostream.h> #include"red-black.h"
void main(){ ArbolRN A1; A1.insertar_rn(29); A1.insertar_rn(19); A1.insertar_rn(12); A1.insertar_rn(50); A1.insertar_rn(15); A1.insertar_rn(33); A1.insertar_rn(70); A1.insertar_rn(23); A1.insertar_rn(42); A1.insertar_rn(61); A1.insertar_rn(25); A1.insertar_rn(31); A1.insertar_rn(66); A1.insertar_rn(64); A1.insertar_rn(63); A1.insertar_rn(32); A1.insertar_rn(62); A1.eliminar_rn(33); /* A1.eliminar_rn(42); A1.eliminar_rn(50); A1.eliminar_rn(61); A1.eliminar_rn(62); A1.eliminar_rn(19);*/ A1.showTree(); cin.get();
23
Presione F5
o haga clic en
24
25
26
V EJERCICIOS 1 Insertar 40, 33, 46, 6, 8, 24, 18, 22, 25, 60 en un rbol rojo negro 2 Implementar a operacin eliminar en un rbol rojo negro
SupresionRN( A, z )
{ if (left(z) = nil(A)) or (right(z) = nil(A)) then y := z; else y := SucesorABB(z); if left(y) ? nil(A) then x := left( y ); else x := right( y ); p(x) := p(y); if p(y) = nil then root( A ) := 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 C(y) = black then AjustarSupresionRN( A, x ) }
AjustarSupresionRN( A, x )
{ /* Ciclo principal */ while x ? root(A) and C(x) = black do { if x = left( p(x) ) then { w := right( p(x) ); if C(w) = red then { 1) C(w) := black; C(p(x)) := red; LeftRotate( A, p(x) ); w := right( p(x) ) }; if ambos hijos de w son negros then {
Mgter. Juan Pablo Apaza Condori
27
2) C(w) := red; x := p(x) } else { if C(right(w)) = black then { 3) C( left(w) ) := black; C(w) := red; RightRotate( A, w ); w := right( p(x) ) }; 4) C(w) := C(p(x)); C(p(x) := black; C(right(w)) := black; LeftRotate( A, p(x) ); x := root( A ) } } else { cdigo simtrico intercambiando "left" y "right" } }; C(x) := black }
28