Árvores Rubro Negra

4,696 views 48 slides Jan 24, 2014
Slide 1
Slide 1 of 48
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48

About This Presentation

No description available for this slideshow.


Slide Content

Árvore Rubro Negra
Prof: Sergio Souza Costa

Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)


[email protected]
https://sites.google.com/site/profsergiocosta/home
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
http://www.slideshare.net/skosta/presentations?order=popular



Algumas
implementações
usam uma sentinela
(apontando para a
raiz) no lugar de NIL.

3
2
Essa é uma
árvore rubro
negra ?

3
2
Essa é uma
árvore rubro
negra ?

Não:
Pela propriedade 5,
todo caminho até as
folhas devem ter o
mesmo números de
nós pretos.

1
Insere 1
r
1


2
Insere 2r
1
1
2
1



3
2
1
r
Insere 4
3
2
1
4
3
2
1
4

3
2
1
r
Insere 4
3
2
1
4
3
2
1
4
3
2
1
4
Verifica as
propriedades
para o avô
O avô é
raiz, muda
a cor
Caso 1, o pai e o tio são vermelhos, muda as cores do do do pai,
tio e avô.








Neste ponto,
sabemos que esta
desbalanceada e
precisaremos fazer
rotações.

O pai está a direita do avô, e o no está a esquerda do pai
3
1
2
r Insere 2
3
1
3
2
1
Caso 2
Rotaciona o pai,
transformando
para o caso 3

3
1
2
r Insere 2
3
1
3
2
1
Caso 2
Rotaciona o pai,
transformando
para o caso 3
3
2
1
>Caso 4b
Pelo caso 3, mudamos as
cores do avo e do pai do nó, e
rotacionamos.
O pai está a direita do avô, e o no está a esquerda do pai

3
1
2
r Insere 2
3
1
3
2
1
Caso 2
Rotaciona o pai,
transformando
para o caso 3
3
2
1
>Caso 4b
Pelo caso 3, mudamos as
cores do avo e do pai do nó, e
rotacionamos.
O pai está a direita do avô, e o no está a esquerda do pai
Este procedimento é
aplicado para ambos
lados

Insere10 – raiz
10

Insere10 – raiz (muda a cor)

10

Insere 85, pai e preto, nao faz nada.

10
85

Insere 15, o pai e vermelho e o tio preto.

10
85
15

Rotaciona e muda cores.
15
10 85

Insere 70, o pai e vermelho e o tio e vermelho.

15
10 85
70

Muda cores
15
10 85
70

Insere 20, pai vermelho e tio preto.
20
15
10 85
70

Rotaciona e muda cores
15
10 70
20
85

Insere 60 , pai vermelho e tio vermelho.
15
10 70
20
85
60

Muda cores
15
10 70
20
85
60

Insere 30, pai vermelho e tio preto.
15
10 70
20
85
60
30

Rotaciona e muda cores.
15
10 70
30
85
6020

Insere 50, pai vermelho e tio vermelho
15
10 70
30
85
6020
50

Insere 50, muda cores


15
10 70
30
85
6020
50
Oops, vermelho e vermelho (70
e 30)

Rotaciona.
30
15 70
20
85
10
60
50

Rotaciona e muda cores.
30
15 70
20
85
10
60
50

Rotaciona e muda cores.
30
15 70
20
85
10
60
50

typedef enum Cor { VERMELHA, PRETA } Cor;
struct RubroNegra {
int key;
struct RubroNegra *dir, *esq, **pai;
Cor cor;

};

void rotacao_esq (RubroNegra **x){
RubroNegra* y = (*x)->dir;
(*x)->dir = y->esq;
y->esq = *x;
*x = y;
}

void insert(int k, RubroNegra** x){
RubroNegra** y = NULL;
while (*x != NULL ) {
y = x;
if (k < key(*x) )
x = &(*x)->esq;
else
x = &(*x)->dir;
}
(*x) = cria_no (k);
(*x)->pai = y;
verificaPropriedades (x);
}

Continua ....
void verificaPropriedades ( RubroNegra** r) {
RubroNegra **p, *u, **g;
p = (*r)->pai;
if ( p == NULL) {
(*r)->cor = PRETA;
}else if ((*p)->cor == VERMELHA ) {
u = tio (r);
g = avo (r);
if (u !=NULL && u->cor == VERMELHA ){
g = avo (r);
(*p)->cor = PRETA;
u->cor = PRETA;
(*g)->cor = VERMELHA;
verificaPropriedades(g);

Continuação
} else { // já sei que o tio e preto, ou vazio
if ( *p == (*g)->dir ) {
if ( key(*r) < key (*p) ) {
rotacao_dir(p);
r = &(*g)->dir->dir;
(*r)->pai = &((*g)->dir);
(*g)->dir->pai = g;
}
(*p)->cor = PRETA;
(*g)->cor = VERMELHA;
rotacao_esq(g);
(*g)->pai = (*g)->esq->pai;
(*g)->esq->pai = g;
(*g)->dir->pai = g;
}
}

Continuação
} else { // já sei que o tio e preto, ou vazio
if ( *p == (*g)->dir ) {
if ( key(*r) < key (*p) ) {
rotacao_dir(p);
r = &(*g)->dir->dir;
(*r)->pai = &((*g)->dir);
(*g)->dir->pai = g;
}
(*p)->cor = PRETA;
(*g)->cor = VERMELHA;
rotacao_esq(g);
(*g)->pai = (*g)->esq->pai;
(*g)->esq->pai = g;
(*g)->dir->pai = g;
}
}
Ainda falta considerar
a rotação o
desbalanceamento
para o outro lado.

Concluem e testem a implementação da rubro-negra.