Árvores rubro negra

48
Árvore Rubro Negra Prof: Sergio Souza Costa

Upload: sergio-souza-costa

Post on 23-Jun-2015

1.717 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: Árvores Rubro Negra

Árvore Rubro Negra

Prof: Sergio Souza Costa

Page 2: Árvores Rubro Negra

Sobre mim

Sérgio Souza CostaProfessor - UFMADoutor 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

Page 3: Árvores Rubro Negra

Page 4: Árvores Rubro Negra

Page 5: Árvores Rubro Negra

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

Page 6: Árvores Rubro Negra
Page 7: Árvores Rubro Negra

3

2 Essa é uma árvore rubro

negra ?

Page 8: Árvores 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.

Page 9: Árvores Rubro Negra
Page 10: Árvores Rubro Negra

Page 11: Árvores Rubro Negra

1Insere 1

r 1

Page 12: Árvores Rubro Negra

●●

Page 13: Árvores Rubro Negra

2

Insere 2r

1 1

2

1

Page 14: Árvores Rubro Negra

●●

Page 15: Árvores Rubro Negra

3

2

1

r Insere 4

3

2

1

4

3

2

1

4

Page 16: Árvores Rubro Negra

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

Page 17: Árvores Rubro Negra

●●

●●

Page 18: Árvores Rubro Negra

●●

●●

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

Page 19: Árvores Rubro Negra

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

1Caso 2

Rotaciona o pai, transformando para o caso 3

Page 20: Árvores Rubro Negra

3

1

2

r Insere 2

3

1

3

2

1Caso 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

Page 21: Árvores Rubro Negra

3

1

2

r Insere 2

3

1

3

2

1Caso 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

Page 22: Árvores Rubro Negra

Insere10 – raiz

10

Page 23: Árvores Rubro Negra

Insere10 – raiz (muda a cor)

10

Page 24: Árvores Rubro Negra

Insere 85, pai e preto, nao faz nada.

10

85

Page 25: Árvores Rubro Negra

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

10

85

15

Page 26: Árvores Rubro Negra

Rotaciona e muda cores.

15

10 85

Page 27: Árvores Rubro Negra

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

15

10 85

70

Page 28: Árvores Rubro Negra

Muda cores

15

10 85

70

Page 29: Árvores Rubro Negra

Insere 20, pai vermelho e tio preto.

20

15

10 85

70

Page 30: Árvores Rubro Negra

Rotaciona e muda cores

15

10 70

20 85

Page 31: Árvores Rubro Negra

Insere 60 , pai vermelho e tio vermelho.

15

10 70

20 85

60

Page 32: Árvores Rubro Negra

Muda cores

15

10 70

20 85

60

Page 33: Árvores Rubro Negra

Insere 30, pai vermelho e tio preto.

15

10 70

20 85

60

30

Page 34: Árvores Rubro Negra

Rotaciona e muda cores.

15

10 70

30 85

6020

Page 35: Árvores Rubro Negra

Insere 50, pai vermelho e tio vermelho

15

10 70

30 85

6020

50

Page 36: Árvores Rubro Negra

Insere 50, muda cores

15

10 70

30 85

6020

50

Oops, vermelho e vermelho (70 e 30)

Page 37: Árvores Rubro Negra

Rotaciona.

30

15 70

20 851060

50

Page 38: Árvores Rubro Negra

Rotaciona e muda cores.

30

15 70

20 851060

50

Page 39: Árvores Rubro Negra

Rotaciona e muda cores.

30

15 70

20 851060

50

Page 40: Árvores Rubro Negra
Page 41: Árvores Rubro Negra
Page 42: Árvores Rubro Negra

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

Page 43: Árvores Rubro Negra

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

Page 44: Árvores Rubro Negra

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

}

Page 45: Árvores Rubro Negra

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

Page 46: Árvores Rubro Negra

Continuação

} else { // já sei que o tio e preto, ou vazioif ( *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;

}}

Page 47: Árvores Rubro Negra

Continuação

} else { // já sei que o tio e preto, ou vazioif ( *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.

Page 48: Árvores Rubro Negra

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