Este documento apresenta uma árvore rubro-negra, incluindo suas propriedades, operações de inserção e rotações para manter a estrutura balanceada. É descrita a implementação em C com enumeração de cores, nós e funções como inserir nós e verificar propriedades.
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
16. 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
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.
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;
}
}