Escolar Documentos
Profissional Documentos
Cultura Documentos
rvore Rubro-Negra
Referncia bibliogrca
Os slides sobre este assunto so parcialmente baseados no captulo 13 do livro T. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein. Introduction to Algorithms, second edition, The MIT Press, 2005.
rvore Rubro-Negra
rvore rubro-negra
Uma rvore rubro-negra uma rvore binria de busca em que cada n constitudo dos seguintes campos: cor (1 bit): pode ser vermelho ou preto. key (e.g. inteiro): indica o valor de uma chave. left, right: ponteiros que apontam para a subrvore esquerda e direita, resp. pai: ponteiro que aponta para o n pai. O campo pai do n raiz aponta para nil. O ponteiro pai facilita a operao da rvore rubro-negra, conforme ser visto a seguir.
rvore Rubro-Negra
26
17
$$ $$$
$$
41
d d
14
d d d d d
35 47
d
15
d d
20 21 30
d d d
nil
d
10 7 3
d
38 39
nil
12
16
nil nil
19
23
nil nil
28
nil
nil
nil nil
nil nil
rvore Rubro-Negra
Todo n da rvore ou vermelho ou preto. A raiz preta. Toda folha (nil) preta. Se um n vermelho, ento ambos os lhos so pretos. Para todo n, todos os caminhos do n at as folhas descendentes contm o mesmo nmero de ns pretos.
rvore Rubro-Negra
Considerao prtica
Considere uma rvore rubro-negra e o ponteiro T apontando para a raiz da rvore. Os ns internos de uma rvore rubro-negra representam as chaves. As folhas so apenas ns ctcios colocados no lugar dos ponteiros nil. Assim, dedicaremos nossa ateno aos ns internos. Por economia de espao, ao invs de representar todas as folhas, podemos fazer todos os ponteiros nil apontarem para uma mesma folha, chamada n sentinela, que ser indicado por nil[T ].
rvore Rubro-Negra
r rr r y e d 1e e d e e 2 e 3 e e e
right-rotate(T , y )
left-rotate(T , x)
d d e e 1e 2e e e
rr r e 3e e
rvore Rubro-Negra
r rr r y e d 1e e d e e 2 e 3 e e e
right-rotate(T , y )
left-rotate(T , x)
d d e e 1e 2e e e
rr r e 3e e
rvore Rubro-Negra
Exemplo de left-rotate
$ $$$ $$ d d d
6
$$
x 11
d
3
d d d
y 18
d
14 12
17
19
d
20
22
rvore Rubro-Negra
Exemplo de left-rotate
$$$ $$$ d d d
6
$$
y 18
d
3
d d d d d
12 19
x 11
d
9
d
14 17
d
20
22
rvore Rubro-Negra
Algoritmo left-rotate
left-rotate(T , x): 1: y rigft[x] 2: right[x] left[y ] 3: if left[y ] = nil[T ] then 4: pai[left[y ]] x 5: end if 6: pai[y ] pai[x] 7: if pai[x] = nil[T ] then 8: T y 9: else 10: if x = left[pai[x]] then 11: left[pai[x]] y 12: else 13: right[pai[x]] y 14: end if 15: end if 16: left[y ] x 17: pai[x] y O algoritmo right-rotate(T , y ) anlogo e no ser apresentado.
rvore Rubro-Negra
O algoritmo de rotao (left-rotate e right-rotate) muda alguns ponteiros da rvore, preservando a propriedade de rvore binria de busca. Leva tempo constante O(1).
rvore Rubro-Negra
1: y nil[T ] 2: x T 3: while x = nil[T ] do 4: y x 5: if key [z] < key [x] then 6: x left[x] 7: else 8: x right[x] 9: end if 10: end while 11: pai[z] y 12: if y = nil[T ] then 13: T z 14: else 15: if key [z] < key [y ] then 16: left[y ] z 17: else 18: right[y ] z 19: end if 20: end if 21: left[z] nil[T ] 22: right[z] nil[T ] 23: cor [z] vermelho 24: RB-insert-xup(T , z)
O algoritmo RB-insert-xup(T , z) re-estrutura a rvore, caso necessrio, atravs da mudana de cores de alguns ns e das operaes de rotao. Siang Wun Song - Universidade de So Paulo - IME/USP rvore Rubro-Negra
Todo n da rvore ou vermelho ou preto. A raiz preta. Toda folha (nil) preta. Se um n vermelho, ento ambos os lhos so pretos. Para todo n, todos os caminhos do n at as folhas descendentes contm o mesmo nmero de ns pretos.
O algoritmo de insero substitui um n sentinela (preto) por um novo n interno vermelho z contendo o valor novo inserido. Este n aponta, por sua vez, a dois ns sentinela (preto), esquerda e direita. Aps a insero, mas antes de executar RB-insert-xup, apenas as propriedades 2 e 4 podem estar violadas: a propriedade 2 violada se z a raiz e a propriedade 4 violada se o pai de z vermelho. O algoritmo RB-insert-xup repara essa eventual violao.
Siang Wun Song - Universidade de So Paulo - IME/USP rvore Rubro-Negra
N z vermelho. Se pai[z] a raiz, ento pai[z] preto. Apenas uma propriedade (2 ou 4) pode estar violada. Se for a propriedade 2, ento porque z (vermelho) a raiz. Se a propriedade violada a 4, ento porque z e pai[z] so ambos vermelhos.
H trs casos a considerar quando z e pai[z] so vermelhos. Existe pai[pai[z]] pois pai[z] sendo vermelho no pode ser a raiz. Caso 1: z tem um tio y vermelho. Caso 2: z tem um tio y preto e z lho direito. Caso 3: z tem um tio y preto e z lho esquerdo. No caso 1, mudamos algumas cores e subimos z para ser pai[pai[z]] e assim sucessivamente, podendo chegar at a raiz. No caso 2 e 3 mudamos algumas cores e fazemos uma ou duas rotaes.
Siang Wun Song - Universidade de So Paulo - IME/USP rvore Rubro-Negra
11
$ $$$ $$ d d d
7
$$
14
d
1
d d d d d
15
d
5 z 4 y 8
Colorimos pai[z] e tio y pretos e pai[pai[z]] vermelho que passa a ser o novo z
rvore Rubro-Negra
11
$ $$$ $$
$$
y 14
d d
1
d d d
z 7
d d d
15
d
5 4
rvore Rubro-Negra
11
$ $$$ $$ d d d
8
$$
y 14
d
z 2
d d d d
15
d
4
d
1
rvore Rubro-Negra
z 2
$$$ $$$
$$
11
d d
1
d d d d
14
d d
4 5 8
d d
15
rvore Rubro-Negra
A altura de uma rvore rubro-negra de n chaves O(log n). O algoritmo RB-insert (linhas 1 a 23), sem contar RB-insert-xup (linha 24), O(log n). No algoritmo RB-insert-xup, o lao while repete somente se caso 1 executado e neste caso o ponteiro z sobe de dois nveis na rvore. O nmero de vezes que o lao pode ser executado portanto O(log n). Se o caso 2 for executado, ento o caso 3 ser executado em seguida. Aps a execuo do caso 3, pai[z] ca preto e o lao while termina. O algoritmo de insero portanto O(log n).
rvore Rubro-Negra
O algoritmo de remoo RB-delete remove o n de forma anloga ao algoritmo de remoo em uma rvore binria de busca. No nal da remoo o algoritmo chama RB-delete-xup que, caso necessrio, muda as cores de alguns ns e re-estrutura a rvore por meio de rotaes. O algoritmo um pouco mais complexo que a insero e h 4 casos a considerar. O algoritmo de remoo O(log n). Omitimos os detalhes que podem ser consultados no livro de Cormen et al.
rvore Rubro-Negra