Á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://si...
●

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

●
●
●
●

●
●

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
par...
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
par...
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
par...
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;
...
void verificaPropriedades ( RubroNegra** r) {
RubroNegra **p, *u, **g;
p = (*r)->pai;
if ( p == NULL) {
(*r)->cor = PRETA;...
Continuação
} else { // já sei que o tio e preto, ou vazio
if ( *p == (*g)->dir ) {
if ( key(*r) < key (*p) ) {
rotacao_di...
Continuação
} else { // já sei que o tio e preto, ou vazio
if ( *p == (*g)->dir ) {
if ( key(*r) < key (*p) ) {
rotacao_di...
Concluem e testem a implementação da rubro-negra.
Árvores Rubro Negra
Árvores Rubro Negra
Árvores Rubro Negra
Árvores Rubro Negra
Próximos SlideShares
Carregando em…5
×

Árvores Rubro Negra

3.414 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
3.414
No SlideShare
0
A partir de incorporações
0
Número de incorporações
27
Ações
Compartilhamentos
0
Downloads
136
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Árvores Rubro Negra

  1. 1. Árvore Rubro Negra Prof: Sergio Souza Costa
  2. 2. 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
  3. 3. ● ●
  4. 4.
  5. 5. Algumas implementações usam uma sentinela (apontando para a raiz) no lugar de NIL. ●
  6. 6. 2 3 Essa é uma árvore rubro negra ?
  7. 7. 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 ?
  8. 8.
  9. 9. r Insere 1 1 1
  10. 10. ● ●
  11. 11. r Insere 2 1 1 1 2 2
  12. 12. ● ● ●
  13. 13. Insere 4 r 2 1 2 2 3 1 1 3 4 3 4
  14. 14. 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
  15. 15. ● ● ● ●
  16. 16. ● ● ● ● Neste ponto, sabemos que esta desbalanceada e precisaremos fazer rotações.
  17. 17. 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
  18. 18. 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.
  19. 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 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.
  20. 20. Insere10 – raiz 10
  21. 21. Insere10 – raiz (muda a cor) 10
  22. 22. Insere 85, pai e preto, nao faz nada. 10 85
  23. 23. Insere 15, o pai e vermelho e o tio preto. 10 85 15
  24. 24. Rotaciona e muda cores. 15 10 85
  25. 25. Insere 70, o pai e vermelho e o tio e vermelho. 15 10 85 70
  26. 26. Muda cores 15 10 85 70
  27. 27. Insere 20, pai vermelho e tio preto. 15 10 85 70 20
  28. 28. Rotaciona e muda cores 15 10 70 20 85
  29. 29. Insere 60 , pai vermelho e tio vermelho. 15 10 70 85 20 60
  30. 30. Muda cores 15 10 70 85 20 60
  31. 31. Insere 30, pai vermelho e tio preto. 15 10 70 85 20 60 30
  32. 32. Rotaciona e muda cores. 15 10 70 85 30 20 60
  33. 33. Insere 50, pai vermelho e tio vermelho 15 10 70 85 30 20 60 50
  34. 34. Oops, vermelho e vermelho (70 e 30) Insere 50, muda cores 15 10 70 85 30 20 60 50
  35. 35. Rotaciona. 30 15 10 70 20 60 50 85
  36. 36. Rotaciona e muda cores. 30 15 10 70 20 60 50 85
  37. 37. Rotaciona e muda cores. 30 15 10 70 20 60 50 85
  38. 38. typedef enum Cor { VERMELHA, PRETA } Cor; struct RubroNegra { int key; struct RubroNegra *dir, *esq, **pai; Cor cor; };
  39. 39. void rotacao_esq (RubroNegra **x){ RubroNegra* y = (*x)->dir; (*x)->dir = y->esq; y->esq = *x; *x = y; }
  40. 40. 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); }
  41. 41. 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 .... {
  42. 42. 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; } }
  43. 43. 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; } }
  44. 44. Concluem e testem a implementação da rubro-negra.

×