Академический Документы
Профессиональный Документы
Культура Документы
Murilo Ybanez
Definição
Uma alternativa às árvore AVL são as
árvores rubro-negras (Bayer, 1972), que
garantem o balanceamento ao impor as
seguintes regras para todos os seus nós
1) Todo nó é vermelho ou preto
2) A raiz é preta
3) Toda folha (NULA) é preta
4) Se um nó é vermelho, ambos os filhos são pretos
5) Todos os caminhos de um nó para as folhas
descendentes contém o mesmo número de nós
pretos
2
Exemplo
18
10 22
3 13 20 27
1 5 12 16 19 21 24 40
14 17
3
Exercício
Quais árvores são rubro-negras?
6 5
3 7
2 10
2 4 8
1 4 7 11
5 9
1
10 0 3 9 12
6
4 8 8
2 5 7 9
4
1 3 10
Altura de Preto
A altura de preto altp de um nó nd é definida como a
quantidade de nós pretos nos caminhos que partem
do mesmo até as folhas 18 3
10 3 22 2
3 2 13 2 20 2 27 1
1 1 1 5 1 12 2 16 1 19 1 21 1 24 1 40
Repare que 1 14 1 17
altp(nd)
) ≤ alt(nd) ≤ 2altp(nd)
5
Operações em Árvores Rubro-
Negras
Vários testes envolvendo pai, tio e avô dos
nós precisam ser feitos para a realização das
operações, e normalmente se usa uma
representação de nó que inclui um ponteiro
para o pai
struct No {
char info;
int cor; //bastaria um bit...
No * pai;
No * esq, * dir;
}; 6
Operações em Árvores Rubro-
Negras
A busca em uma árvore rubro-negra é
idêntica à busca em uma árvore não
balanceada
Já as operações de inserção e remoção
podem desbalancear a árvore, o que pode
ser corrigido com até três rotações e
seqüências de operações de trocas de cores
As rotações podem ser para esquerda ou
para direita e são as mesmas realizadas nas
operações em árvores AVL
7
Inserção
O nó a ser inserido em uma árvore rubro-
negra sempre será o pai de uma folha nula
e inicialmente é vermelho, para não mudar
a altura de preto
Portanto, somente duas propriedades
podem ser violadas
1) A raiz é preta
4) Se um nó é vermelho, ambos os filhos são pretos
8
Algoritmo de Inserção
A violação da propriedade 1 pode ser
resolvida apenas com a mudança da cor da
raiz
1 40 1 40
9
Algoritmo de Inserção
Três situações (e casos simétricos) têm de
ser consideradas quando a inserção do nó
viola a propriedade 4
O pai e o tio do nó são vermelhos
O pai é vermelho, o tio é preto e o nó é um filho
da direita
O pai é vermelho, o tio é preto e o nó é um filho
da esquerda
10
Algoritmo de Inserção
O pai e o tio do nó são vermelhos
Se o pai de a é vermelho
ou a é raiz, há uma nova
a 1 a 2 violação das propriedades
rubro-negras
t p 1 t p 1
1 1
x x
11
Algoritmo de Inserção
O pai é vermelho, o tio é preto e o nó é um
filho da direita
a p
t Rotação Simples
p a x
x t
Caso simétrico? 12
Algoritmo de Inserção
O pai é vermelho, o tio é preto e o nó é um
filho da esquerda
a x
t
Rotação Dupla p
p a
x t
Caso simétrico? 13
Exercício
O que acontece com a inserção do valor 14
na árvore abaixo?
18
10 22
3 13 27
12 16
14
14
Algoritmo de Inserção
O balanceamento é realizado a partir do nó
que foi inserido, o que torna desnecessário
guardar o caminho de volta para a raiz. Em
função disso, utiliza-se um algoritmo iterativo
para a inserção, seguido da operação de
balanceamento
inserir(raiz, x) {
/* Inserir usando algoritmo iterativo */
...
balancear_ins(nd_x);
}
15
Algoritmo de Inserção
Algoritmo de balanceamento em C
18
Remoção
Se o nó removido for vermelho, nada precisa ser
feito pelas seguintes razões:
Nenhuma altura de preto muda
Nós vermelhos não se tornam adjacentes
Por ser vermelho, o nó removido não pode ser a raiz, que
continua preta
Se o nó removido for preto, as seguintes
propriedades podem ser violadas:
1) A raiz é preta
4) Se um nó é vermelho, ambos os filhos são pretos
5) Todos os caminhos de um nó para as folhas
descendentes contém o mesmo número de nós pretos 19
Algoritmo de Remoção
A perda de um nó preto pode ser compensada ao
se incluir um nó preto adicional nos caminhos para
as folhas que passavam pelo nó excluído. Isto
pode ser obtido com trocas de cores e rotações
Todas as manipulações serão feitas a partir do nó x que
assume o lugar do nó preto excluído
18 2 altp_e = 1 18 altp_d = 2
10 1 22 1 x 13 1 22 1
13 1 20 1 27 1 20 1 27 1
20
Algoritmo de Remoção
Quatro situações (e casos simétricos) têm de
ser consideradas no que diz respeito aos
parentes de x
o irmão de x é vermelho
o irmão e os sobrinhos de x são pretos
o irmão de x é preto o sobrinho da direita é
vermelho
o irmão de x é preto, o sobrinho da esquerda é
vermelho e o sobrinho da direita é preto
21
Algoritmo de Remoção
Um nó preto adicional pode eventualmente
ser inserido se o irmão de x é preto. Se o
irmão for vermelho, a primeira providência é
torná-lo preto com uma rotação
altp_e = altp-1 p altp_d = altp
i
c d e f Caso simétrico? a b c d
22
Algoritmo de Remoção
Irmão e os sobrinhos de x são pretos
Pai vermelho
Nó preto
adicional
x i x i
se sd se sd
a b a b
Caso simétrico?
c d e f c d e f
23
Algoritmo de Remoção
Irmão e os sobrinhos de x são pretos
Pai preto Nó preto
adicional acima
de p, que se
torna o novo x
x i x i
se sd se sd
a b a b
Caso simétrico?
c d e f c d e f
24
Algoritmo de Remoção
Irmão de x é preto e o sobrinho da direita é
vermelho
Assume a cor
que era de p
se sd Rotação Simples x se
a b e f
a
c d e f Caso simétrico? b c d
25
Algoritmo de Remoção
O irmão de x é preto, o sobrinho da esquerda
é vermelho e o sobrinho da direita é preto
Assume a cor
que era de p
se sd Rotação Dupla x sd
a b c d
a
c d e f Caso simétrico? b e f
26
Algoritmo de Remoção
O balanceamento é realizado a partir do nó
x. Utiliza-se um algoritmo iterativo para a
remoção, seguido da operação de
balanceamento
remover(raiz, y) {
/* Remover y usando algoritmo iterativo,
sendo nd_x o nó substituto */
...
balancear_rem(nd_x);
}
27
Algoritmo de Remoção
Algoritmo de balanceamento em C
while (no != raiz && no->cor == 'P') {
No * pai = no->pai;
if (no == pai->esq) {
No * irmao = pai->dir; 18
if (irmao->cor == 'V') {
pai->cor = 'V';
irmao->cor = 'P';
x 13 22
rotacionar_esq(pai);
20 27
} else {
//Irmão preto
}
} else { //Casos simétricos }
}
no->cor = 'P';
28
Algoritmo de Remoção
Algoritmo de balanceamento em C
//Irmão preto
if (irmao->dir->cor == 'P') {
if (irmao->esq->cor == 'P') {
irmao->cor = 'V';
no = pai; 18
} else {
irmao->cor = 'V'; x 13 22
irmao->esq->cor = 'P';
rotacionar_dir(irmao); 20 27
}
} else {
irmao->cor = pai->cor;
irmao->dir->cor = 'P';
pai->cor = 'P';
rotacionar_esq(pai);
no = raiz; //para finalizar 29
}
Exercício
Forneça a árvore resultante da exclusão dos
valores 2, 3, 4, 5 e 6
30
Eficiência da Árvore Rubro-
Negra
Como a altura da árvore rubro-negra varia
com a quantidade de nós?
Qual a pior árvore para uma determinada
altura de preto bh?
3 40
2 40
1 40 20 60
0
N0 = 1
20 60
N1 = 1 10 30 50 70
N2 = 3
N3 = 7 31
Eficiência da Árvore Rubro-
Negra
Se Nbh representa a quantidade de nós de
uma árvore com altura de preto bh, o pior
caso ocorre quando h = bh e a seguinte
relação se torna válida
Nbh = 2bh-1
Por outro lado, como bh ≤ h ≤ 2bh, e portanto
bh ≥ h/2, então
Nbh ≥ 2h/2-1
32
Eficiência da Árvore Rubro-
Negra
Resolvendo a inequação anterior para h,
chega-se finalmente a
h ≤ 2 log (Nbh+1),
e portanto, no pior caso, temos
h = 2 log (Nbh+1)
Na equação acima, h representa a maior
altura que uma árvore com altura de pretos
bh pode ter, e Nbh é a quantidade de nós da
pior árvore com altura de pretos bh. 33
Árvores Rubro-Negras vs
Árvores AVL
Vantagens da AVL sobre a Rubro-Negra
Conceito mais simples
Altura da árvore no pior caso
1,44 log(n) vs. 2 log(n)
Eficiente para árvores que mudam pouco
Vantagens da Rubro-Negra sobre a AVL
Apenas 1 bit de informação de balanceamento
Remoção requer no máximo 3 rotações
Eficiente para árvores que mudam muito
34
Animação
Animação
35