Vous êtes sur la page 1sur 28

Sesin UNIVERSIDAD CATLICA DE SANTA MARIA P. P.

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).

Mgter. Juan Pablo Apaza Condori

RBOL ROJO NEGRO: CONDICIONES

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.

RBOL ROJO NEGRO: EJEMPLO

Mgter. Juan Pablo Apaza Condori

RBOL ROJO NEGRO: LEMA

Lema

Consecuencias del 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

al color del padre del nodo que se ha

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

Mgter. Juan Pablo Apaza Condori

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

Mgter. Juan Pablo Apaza Condori

RBOL ROJO NEGRO: EJEMPLO DE INSERCIN Generar el rbol Rojo Negro con la siguiente secuencia de datos:

10, 5, 1, 2, 15, 18, 3, 20, 40


1 Insertar 10, 5

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

Mgter. Juan Pablo Apaza Condori

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

Mgter. Juan Pablo Apaza Condori

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

Mgter. Juan Pablo Apaza Condori

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

Mgter. Juan Pablo Apaza Condori

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

Mgter. Juan Pablo Apaza Condori

RBOL ROJO NEGRO: ELIMINAR

Coincide con la operacin de supresin en los rboles de bsqueda binaria

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 NIL NIL

NIL

NIL

NIL

P V
+

S NR

NL
NIL

NIL

NIL

NIL

NIL

NIL

Mgter. Juan Pablo Apaza Condori

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

NIL

NIL

NIL

NIL

NIL

P V NL

S NR

NIL NIL NIL NIL NIL

NIL

Mgter. Juan Pablo Apaza Condori

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

Mgter. Juan Pablo Apaza Condori

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

Mgter. Juan Pablo Apaza Condori

13

EJEMPLO 2 Eliminar el 2 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 1 10 15 20

NIL

3
NIL NIL NIL

NIL

18
NIL NIL NIL

40
NIL

Mgter. Juan Pablo Apaza Condori

14

EJEMPLO 3 Eliminar el 15 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 1 Aplicando el patrn 3

5 2 V+
NIL

10

P S

1
NIL NIL NIL

3
NIL

20 NL

18
NIL NIL

40

NR

NIL

NIL

Mgter. Juan Pablo Apaza Condori

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

Mgter. Juan Pablo Apaza Condori

16

EJEMPLO 4 Eliminar el

5 y luego 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 1 Dado que el nodo V es rojo:

3 2 S P 10
NIL

1
NIL

NIL

20

NL

NIL

NR

18
NIL NIL NIL

40
NIL

Mgter. Juan Pablo Apaza Condori

17

2 Eliminando 3

2 V+ 1 NR

P 10 S

NL

NIL

NIL

NIL

20

18
NIL NIL NIL

40
NIL

Como V tiene ahora la unidad extra de color negro entonces es absorbida

2 V 1 NR

P 10 S

NL

NIL

NIL

NIL

20

18
NIL NIL NIL

40
NIL

Mgter. Juan Pablo Apaza Condori

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

Mgter. Juan Pablo Apaza Condori

19

RBOL ROJO NEGRO:: PROGRAMA EN C++

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{

Mgter. Juan Pablo Apaza Condori

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();

Mgter. Juan Pablo Apaza Condori

23

Presione F5

o haga clic en

Mgter. Juan Pablo Apaza Condori

24

IV ACTIVIDADES 1 Ingrese a la siguiente direccin URL http://reptar.uta.edu/NOTES5311/REDBLACK/RedBlack.html

Mgter. Juan Pablo Apaza Condori

25

2 Ingrese a la siguiente direccin URL http://webpages.ull.es/users/jriera/Docencia/AVL/AVL%20tree%20applet.htm

Mgter. Juan Pablo Apaza Condori

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 }

Mgter. Juan Pablo Apaza Condori

28

Vous aimerez peut-être aussi