Árvore Rubro Negra
Prof: Sergio Souza Costa
Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)
prof.sergio.costa@gmail.com

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

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

●
2
3

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.

2
3

Essa é uma
árvore rubro
negra ?
●
r

Insere 1

1

1
●
●
r

Insere 2

1

1

1
2

2
●
●

●
Insere 4

r
2
1

2

2
3

1

1
3
4

3
4
Caso 1, o pai e o tio são vermelhos, muda as cores do do do pai,
Verifica as
tio e avô.
propriedades
para o avô

Insere 4

r
2
1

2

2
3

1

1

3
4

2
O avô é
raiz, muda
a cor

1

3
4

3
4
●
●

●
●
●
●

●
●

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
r

Insere 2
Caso 2

1

1

1

Rotaciona o pai,
transformando
para o caso 3

2
3

3

3
2
O pai está a direita do avô, e o no está a esquerda do pai
r

Insere 2
Caso 2

1

1

1

Rotaciona o pai,
transformando
para o caso 3

2
3

3

3
2

2
>Caso 4b
1

3

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
r

Insere 2
Caso 2

1

1

1

Rotaciona o pai,
transformando
para o caso 3

2
3

3

3
2

Este procedimento é
aplicado para ambos
lados
Pelo caso 3, mudamos as

2
>Caso 4b
1

3

cores do avo e do pai do nó, e
rotacionamos.
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.
15

10

85

70
20
Rotaciona e muda cores
15

10

70

20

85
Insere 60 , pai vermelho e tio vermelho.
15

10

70

85

20

60
Muda cores
15

10

70

85

20

60
Insere 30, pai vermelho e tio preto.
15

10

70

85

20

60

30
Rotaciona e muda cores.
15

10

70

85

30

20

60
Insere 50, pai vermelho e tio vermelho
15

10

70

85

30

20

60

50
Oops, vermelho e vermelho (70
e 30)

Insere 50, muda cores
15

10

70

85

30

20

60

50
Rotaciona.
30

15
10

70
20

60

50

85
Rotaciona e muda cores.
30

15
10

70
20

60

50

85
Rotaciona e muda cores.
30

15
10

70
20

60

50

85
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);
}
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 ....

{
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;
Ainda falta considerar
rotacao_esq(g);
(*g)->pai = (*g)->esq->pai; a rotação o
desbalanceamento
(*g)->esq->pai = g;
para o outro lado.
(*g)->dir->pai = g;
}
}
Concluem e testem a implementação da rubro-negra.

Árvores Rubro Negra

  • 1.
    Árvore Rubro Negra Prof:Sergio Souza Costa
  • 2.
    Sobre mim Sérgio SouzaCosta Professor - UFMA Doutor em Computação Aplicada (INPE) prof.sergio.costa@gmail.com https://sites.google.com/site/profsergiocosta/home http://www.slideshare.net/skosta/presentations?order=popular https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta
  • 3.
  • 4.
  • 5.
  • 7.
  • 8.
    Não: Pela propriedade 5, todocaminho até as folhas devem ter o mesmo números de nós pretos. 2 3 Essa é uma árvore rubro negra ?
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
    Caso 1, opai e o tio são vermelhos, muda as cores do do do pai, Verifica as tio e avô. propriedades para o avô Insere 4 r 2 1 2 2 3 1 1 3 4 2 O avô é raiz, muda a cor 1 3 4 3 4
  • 17.
  • 18.
    ● ● ● ● Neste ponto, sabemos queesta desbalanceada e precisaremos fazer rotações.
  • 19.
    O pai estáa direita do avô, e o no está a esquerda do pai r Insere 2 Caso 2 1 1 1 Rotaciona o pai, transformando para o caso 3 2 3 3 3 2
  • 20.
    O pai estáa direita do avô, e o no está a esquerda do pai r Insere 2 Caso 2 1 1 1 Rotaciona o pai, transformando para o caso 3 2 3 3 3 2 2 >Caso 4b 1 3 Pelo caso 3, mudamos as cores do avo e do pai do nó, e rotacionamos.
  • 21.
    O pai estáa direita do avô, e o no está a esquerda do pai r Insere 2 Caso 2 1 1 1 Rotaciona o pai, transformando para o caso 3 2 3 3 3 2 Este procedimento é aplicado para ambos lados Pelo caso 3, mudamos as 2 >Caso 4b 1 3 cores do avo e do pai do nó, e rotacionamos.
  • 22.
  • 23.
    Insere10 – raiz(muda a cor) 10
  • 24.
    Insere 85, paie preto, nao faz nada. 10 85
  • 25.
    Insere 15, opai e vermelho e o tio preto. 10 85 15
  • 26.
    Rotaciona e mudacores. 15 10 85
  • 27.
    Insere 70, opai e vermelho e o tio e vermelho. 15 10 85 70
  • 28.
  • 29.
    Insere 20, paivermelho e tio preto. 15 10 85 70 20
  • 30.
    Rotaciona e mudacores 15 10 70 20 85
  • 31.
    Insere 60 ,pai vermelho e tio vermelho. 15 10 70 85 20 60
  • 32.
  • 33.
    Insere 30, paivermelho e tio preto. 15 10 70 85 20 60 30
  • 34.
    Rotaciona e mudacores. 15 10 70 85 30 20 60
  • 35.
    Insere 50, paivermelho e tio vermelho 15 10 70 85 30 20 60 50
  • 36.
    Oops, vermelho evermelho (70 e 30) Insere 50, muda cores 15 10 70 85 30 20 60 50
  • 37.
  • 38.
    Rotaciona e mudacores. 30 15 10 70 20 60 50 85
  • 39.
    Rotaciona e mudacores. 30 15 10 70 20 60 50 85
  • 42.
    typedef enum Cor{ VERMELHA, PRETA } Cor; struct RubroNegra { int key; struct RubroNegra *dir, *esq, **pai; Cor cor; };
  • 43.
    void rotacao_esq (RubroNegra**x){ RubroNegra* y = (*x)->dir; (*x)->dir = y->esq; y->esq = *x; *x = y; }
  • 44.
    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); }
  • 45.
    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 .... {
  • 46.
    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; } }
  • 47.
    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; Ainda falta considerar rotacao_esq(g); (*g)->pai = (*g)->esq->pai; a rotação o desbalanceamento (*g)->esq->pai = g; para o outro lado. (*g)->dir->pai = g; } }
  • 48.
    Concluem e testema implementação da rubro-negra.