Anda di halaman 1dari 43

rvore Rubro-Negra

Brunner K. Nogueira
Gustavo R. Correia
Igor H. C. Pinheiro
Lucas S. Magalhes

Definio
Uma rvore rubro-negra um tipo de rvore de busca
binria balanceada, um tipo de estrutura de dados,
tipicamente usada para implementar vetores associativos.
Ela complexa, mas tem um bom pior-caso de tempo de
execuo para suas operaes e eficiente na prtica:
pode-se buscar, inserir, e remover em tempo O(log n), onde
n o nmero total de elementos da rvore. De maneira
simplificada, uma rvore rubro-negra uma rvore de
busca binria que insere e remove de forma inteligente,
para assegurar que a rvore permanea aproximadamente
balanceada.

Propriedades
Um n vermelho ou preto.
A raiz preta. (Esta regra usada em algumas definies.
Como a raiz pode sempre ser alterada de vermelho para
preto, mas no sendo vlido o oposto, esta regra tem pouco
efeito na anlise.)
Todas as folhas(NIL) so pretas.
Ambos os filhos de todos os ns vermelhos so pretos.
Todo caminho de um dado n para qualquer de seus ns
folhas descendentes contem o mesmo nmero de ns
pretos.

Definio
(Altura negra) A altura negra de uma rvore rubro-negra A, denotada
an(A) o nmero de ns negros que se encontram nos caminhos da
raiz at uma folha.
4
47
7

68

32

15

88

60

40

54

61

75

90

Observe que, pela terceira 50


condio da definio de rvore rubronegra, esse nmero bem definido. No caso da rvore acima, a
altura negra 3

Exemplo

Estrutura

Estrutura
typedef struct No {
enum cor {PRETO,VERMELHO} cor;
int info;
struct No *esq, *dir, *pai;
} NO;

Funes Auxiliares

Funo Av
NO * avo(NO *a){
if ((a != NULL) && (a->pai != NULL))
return a->pai->pai;
else
return NULL;
}

Funo Tio
NO * tio(NO *a){
NO *b = avo(a);
if (b == NULL)
return NULL;
if (a->pai == b->esq)
return b->dir;
else
return b->esq;
}

Funo Irmo
NO * irmao(NO *a){
if (a == a->pai->esq)
return a->pai->dir;
else
return a->pai->esq;
}

Funes de Organizao

Definio
Todo n a ser inserido por conveno rubro
Se aps a insero for quebrada qualquer propriedade da ARN
devem ser feitas rotaes e/ou inverso de cores dos ns para
que sejam satisfeitas todas as propriedades
As regras de insero levam em considerao a cor do tio (o
outro filho do pai do n que recebeu o novo n) do n inserido

Insere
void insere(NO **a, int info){
if (*a == NULL)
*a=criaNo(info);
else if (info<(*a)->info)
insere (&((*a)->esq), info);
else
insere(&((*a)->dir), info);
organiza_caso1(a);
}

Caso 1
void organiza_caso1(NO *a){
if (a->pai == NULL)
a->cor = PRETO;
else
organiza_caso2(a);
}

Caso 2
void organiza_caso2(NO *a){
if (a->pai->cor == PRETO)
return;
else
organiza_caso3(a);
}

Caso 3
void organiza_caso3(NO *a){
NO *c = tio(a), *b;
if((c!=NULL)&&(c->cor==VERMELHO)){
a->pai->cor = PRETO;
c->cor = PRETO;
b = avo(a);
b->cor = VERMELHO;
organiza_caso1(b);
}
else
organiza_caso4(a);
}

Caso 4
void organiza_caso4(NO *a){
NO *b = avo(a);
if ((a == a->pai->dir) && (a->pai == b->esq)){
rotacionar_esq(a->pai);
a = a->esq;
}
else if ((a == a->pai->esq) && (a->pai == b->dir)){
rotacionar_dir(a->pai);
a = a->dir;
}
organiza_caso5(a);
}

Caso 5
void organiza_caso5(NO *a){
NO *b = avo(a);
a->pai->cor = PRETO;
b->cor = VERMELHO;
if ((a == a->pai->esq) && (a->pai == b->esq))
rotacionar_dir(b);
else
rotacionar_esq(b);
}

Esquemas de Insero

Esquema 1
w

tio

v
q

Esquema 2
w

w
v
q

rai
z

w
v
q

Esquema 3
w
v
q

Esquema 4
( Antes )

( Depois )

v
q

Esquema 5
( Antes )

( Depois )

q
v

Funes de Remoo

Regras de Remoo
A remoo em rvores rubro-negras pode ser
realizada tambm com um nmero logartmico de
operaes
O procedimento de remoo composto de uma etapa
de remoo em rvore binria de busca seguido de
uma etapa de balanceamento, caso as propriedades
rubro-negras teriam sido destrudas durante a
operao

Regras de Remoo
Se o n removido for rubro, a rvore continua rubronegra, pois todas as condies da definio ficam
vlidas:
1. Os ns resultantes tem cor rubro ou negro
2. A raiz, que era negra, no foi removida
3. Nenhum n negro foi removido, portanto todos os caminhos
da raiz at uma folha tem um nmero igual de ns negros
4. Os filhos de todos os ns rubros no removidos no foram
alterados e portanto ficam negros

Regras de Remoo
Se o n removido for negro, o nmero de ns de pelo menos um caminho foi
decrementado e consequentemente a terceira condio ficou invlida.
Quando isto acontece, dois tipos de soluo so possveis:
remoo preguiosa- A remoo preguiosa consiste em marcar o n
como removido, mas sem tira-lo da rvore. Nenhum remanejamento
necessrio. Em compensao, os algoritmos de insero e busca devem
ser modificados para levar em conta que alguns ns da rvore devem
ser considerados como ausentes. A adoo desta soluo possvel
quando as rvores rubro-negras so usadas no contexto de uma
aplicao com poucas operaes de remoo
remoo efetiva - Atravs de um nmero logartmico de operaes, a
remoo efetiva restabelece as propriedades para que a rvore seja
rubro-negra. Essas operaes so detalhadas em seguida

Remove Filho
void remove_filho(NO *a){
NO *filho = eFolha(a->dir) ? a->esq : a->dir;
troca_No(a, filho);
if (a->cor == PRETO) {
if (filho->cor == VERMELHO)
filho->cor = PRETO;
else
apaga_caso1(filho);
}
free(a);
}

Caso 1

void apaga_caso1(NO *a){


if (a->pai != NULL)
apaga_caso2(a);
}

Caso 2
void apaga_caso2(NO *a){
NO *d = irmao(a);
if (d->cor == VERMELHO){
a->pai->cor = VERMELHO;
d->cor = PRETO;
if (a == a->pai->esq)
rotacionar_esq(a->pai);
else
rotacionar_dir(a->pai);
}
apaga_caso3(a);
}

Caso 3
void apaga_caso3(NO *a){
NO *d = irmao(a);
if ((a->pai->cor == PRETO) && (d->cor == PRETO)
&& (d->esq->cor == PRETO) && (d->dir->cor == PRETO))
{
d->cor = VERMELHO;
apaga_caso1(a->pai);
}
else
apaga_caso4(a);
}

Caso 4
void apaga_caso4(NO *a){
NO *d = irmao(a);
if ((a->pai->cor == VERMELHO) && (d->cor == PRETO)
&& (d->esq->cor == PRETO) && (d->dir->cor ==
PRETO)){
d->cor = VERMELHO;
a->pai->cor = PRETO;
}
else
apaga_caso5(a);
}

Caso 5
void apaga_caso5(NO *a){
NO *d = irmao(a);
if (d->cor == PRETO) {
if ((a == a->pai->esq) && (d->dir->cor == PRETO)
&& (d->esq->cor == VERMELHO)){
d->cor = VERMELHO;
d->esq->cor = PRETO;
rotacionar_dir(d);
}
else if ((a == a->pai->dir)&&(d->esq->cor==PRETO)
&&(d->dir->cor==VERMELHO)){
d->cor = VERMELHO;
d->dir->cor = PRETO;
rotacionar_esq(d);
}
}
apaga_caso6(a);
}

Caso 6
void apaga_caso6(NO *a){
NO *d = irmao(a);
d->cor = a->pai->cor;
a->pai->cor = PRETO;
if (a == a->pai->esq){
d->dir->cor = PRETO;
rotacionar_esq(a->pai);
}
else{
d->esq->cor = PRETO;
rotacionar_dir(a->pai);
}
}

Esquemas de Remoo
Efetiva

Esquema 1
( Antes )

( Depois )

w
x

Esquema 2
( Antes )

( Depois )

vc

vc

Esquema 3
( Depois )

( Antes )

vc

vc
x

Esquema 4
( Depois )

( Antes )

wc

vc
x

Comparao Entre rvores

Comparao Entre rvores