Árvores Rubro Negra
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,182
On Slideshare
1,164
From Embeds
18
Number of Embeds
1

Actions

Shares
Downloads
46
Comments
0
Likes
0

Embeds 18

https://mj89sp3sau2k7lj1eg3k40hkeppguj6j-a-sites-opensocial.googleusercontent.com 18

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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