E
STRUTURASDED
ADOS EA
LGORITMOSÁ
RVORESR
UBRO-N
EGRAS Adalberto CajueiroDepartamento de Sistemas e Computação Universidade Federal de Campina Grande
1
Á
RVOREPV
É uma árvore binária de busca cujo nó contém uma informação extra: cor.
Através de restrições (invariantes ou propriedades) é possível se atingir uma configuração aproximadamente balanceada.
A altura de um filho nunca é maior que o dobro da altura do outro filho
Á
RVOREPV
Invariantes (propriedades)
Cada nó possui uma cor: ou preta ou vermelha
Toda folha (NIL) é preta
A raiz é preta
Todos os filhos de um nó vermelho são pretos
Todo caminho simples de um nó a uma folha
descendente contém o mesmo número de nós (≠ NIL) pretos.
Black-height
3
Á
RVOREPV
Exemplo
E
XERCÍCIO Quais destas árvores são preto-vermelho?
42
50 44
42
50 40
42
50 40
5
E
XERCÍCIO Qual o black-height do nó 7?
E
XERCÍCIO Qual o black-height do nó 7?
2
O black-height da raiz é o black height da árvore pv
7
POSCOMP 2009
POSCOMP 2009
9
Á
RVOREPV
Lema: uma árvore preto-vermelho com n nós internos tem no máximo a altura de:
Consequencia imediata:
Busca, Maximo e Minimo podem ser implementados em O(lg n).
Insercoes e remocoes sao um pouco diferente: devem garantir as propriedades de uma árvore PV.
h
≤
2.lg(n+1)
Á
RVOREPV (E
XERCÍCIO)
Desenhe uma arvore binaria completa com os
valores {1,2,…,15}, e os nós vazios. Em seguida
pinte os nós de tres formas diferentes tal que o black-height das arvores PV resultantes sejam 2, 3 e 4
11
Á
RVOREPV (E
XERCÍCIO)
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
Á
RVOREPV (E
XERCÍCIO)
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
Bh= 2
13
Á
RVOREPV (E
XERCÍCIO)
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
Bh= 3
Á
RVOREPV (E
XERCÍCIO)
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
Bh= 3
15
Á
RVOREPV (E
XERCÍCIO)
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
Bh= 3
Á
RVOREPV (E
XERCÍCIO)
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
Bh= 4
17
Á
RVOREPV
Como representar o nó e uma árvore PV em Java?
É possível reusar algo anterior?
Á
RVOREPV
Como representar o nó e uma árvore PV em Java?
É possível reusar algo anterior?
public class RBNode<T extends Comparable<T>> extends BSTNode<T> {
enum Color {BLACK, RED};
protected Color color; public RBNode() {
this.color = Color.BLACK;
}
@Override
public boolean equals(Object obj) { return super.equals(obj)
&& this.colour == ((RBNode<T>) obj).getColour();
} }
19
Á
RVOREPV
Como representar o nó e uma árvore PV em Java?
É possível reusar algo anterior?
...
@Override
public String toString(){
String resp = "NIL";
if(!isEmpty()){
resp = "(" + data.toString();
if(colour == Colour.RED){
resp = resp + ",R)"; }else{
resp = resp + ",B)"; }
}
return resp;
}
Á
RVOREPV
Como representar o nó e uma árvore PV em Java?
É possível reusar algo anterior?
public interface RBTree<T extends Comparable<T>> extends AVLTree<T>{
public RBNode<T>[] extendedPreOrder();
}
public class RBTreeImpl<T extends Comparable<T>> extends AVLTreeImpl<T>implements RBTree<T> {
} 21
Á
RVOREPV
Como representar o nó e uma árvore PV em Java?
É possível reusar algo anterior?
public interface RBTree<T extends Comparable<T>> extends AVLTree<T>{
public RBNode<T>[] extendedPreOrder();
}
public class RBTreeImpl<T extends Comparable<T>> extends AVLTreeImpl<T>implements RBTree<T> {
} 22
Á
RVOREPV
Como representar o nó e uma árvore PV em Java?
É possível reusar algo anterior?
public interface RBTree<T extends Comparable<T>> extends AVLTree<T>{
public RBNode<T>[] extendedPreOrder();
}
public class RBTreeImpl<T extends Comparable<T>> extends AVLTreeImpl<T>implements RBTree<T> {
public void insert(T elem);
public void remove(T elem); //nao implementar
} 23
Que métodos auxiliares precisam ser implementados!
Á
RVOREPV
24 public class RBTreeImpl<T extends Comparable<T>> extends AVLTreeImpl<T>implements RBTree<T> {
public void insert(T elem); public void remove(T elem);
int blackHeight();
protected boolean verifyProperties(){ return verifyNodesColour() &&
verifyNILNodeColour() && verifyRootColour() &&
verifyChildrenOfRedNodes() && verifyBlackHeight();
}
void fixUpInsert(RBNode<T> node);
Á
RVOREPV
Como é feita a pesquisa em uma árvore PV?
25
Á
RVOREPV
Como é feita a pesquisa em uma árvore PV?
A pesquisa realizada em uma árvore preto-vermelho é igual a realizada em uma árvore binária de
pesquisa
Tempo = O(log n)
Á
RVOREPV
Inserções
Insira o nó 51 na árvore abaixo. Qual a melhor cor para o novo nó e por que?
27
Á
RVOREPV
Inserções
Insira o nó 51 na árvore abaixo. Qual a melhor cor para o novo nó e por que?
51
Á
RVOREPV
Inserções
Insira o nó 87. Preserva o invariante?
29
Á
RVOREPV
Inserções
Insira o nó 87. Preserva o invariante?
87
Á
RVOREPV
Inserções
Insira o nó 87. Preserva o invariante?
31
87 Como manter o invariante de uma árvore PV após uma inclusão?
Á
RVOREPV
Inserções
Novo nó tem sempre cor vermelha
Insere o novo elemento normalmente como na BST
Se violar invariantes tem que consertar a árvore
Considerar 5 casos sequenciais: 1 2 3 4 5 Dica: focar no tio do novo nó
Á
RVOREPV
Inserções
33
RB-INSERT(N)
TREE-INSERT(N)
color[N]
← RED
FIXUP_CASE1(N)
Á
RVOREPV
Inserções
34
FIXUP_CASE1(N){
if (N is root)
N.color = BLACK
else
FIXUP_CASE2(N)
}
Á
RVOREPV
Inserções
35
FIXUP_CASE2(N){
if (N.parent.color = BLACK) //OK.
else
FIXUP_CASE3(N) }
N P
OK
Á
RVOREPV
Inserções
36
FIXUP_CASE3(N){ if (U.color = RED) P.color = BLACK U.color = BLACK G.color = RED FIXUP_CASE1(G) else
FIXUP_CASE4(N){ Next = N
if (N is right child and P is left child) leftRotation(P)
Next = N.left
else if (N is left child P is right child) rightRotation(P)
Next = N.right
FIXUP_CASE5(Next) }
Á
RVOREPV
37
Á
RVOREPV
38
FIXUP_CASE4(N){ Next = N
if (N is right child and P is left child) leftRotation(P)
Next = N.left
else if (N is left child P is right child) rightRotation(P)
Next = N.right
Á
RVOREPV
39
//N is left child and P is left child FIXUP_CASE5(N){
P.color = BLACK G.color = RED if (N is left child) rightRotation(G) else
leftRotation(G) }
Á
RVOREPV
40
//N is left child and P is left child FIXUP_CASE5(N){
P.color = BLACK G.color = RED if (N is left child) rightRotation(G) else
E
XEMPLO Insira o nó 8
41
8
FIXUP_CASE1(8)
E
XEMPLO Insira o nó 8
42
8
E
XEMPLO Insira o nó 4
43
8
FIXUP_CASE1(4) FIXUP_CASE2(4)
4
E
XEMPLO Insira o nó 4
44
8
FIXUP_CASE1(4) FIXUP_CASE2(4) if P.color = BLACK //OK
E
XEMPLO Insira o nó 2
45
8
FIXUP_CASE1(2) FIXUP_CASE2(2) if P.color = BLACK //OK
else
FIXUP_CASE3(2) 4
2
E
XEMPLO Insira o nó 2
46
8
FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) if (U.color = RED) ...
else
FIXUP_CASE4(N) 4
E
XEMPLO Insira o nó 2
47
8
FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) if (U.color = RED) ...
else
FIXUP_CASE4(N) 4
2 N
E
XEMPLO Insira o nó 2
48
8
FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) FIXUP_CASE4(N) 4
E
XEMPLO Insira o nó 2
49 8 FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) FIXUP_CASE4(2) Next = 2
if (N is right child and P is left child) ...
else if (N is left child P is right child) ... FIXUP_CASE5(Next) 4 2 N
E
XEMPLO Insira o nó 2
E
XEMPLO Insira o nó 2
51 8 FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) FIXUP_CASE4(2) FIXUP_CASE5(2) P.color = BLACK G.color = RED if (N is left child) rightRotation(G) else leftRotation(G) 4 2 N P G
E
XEMPLO Insira o nó 2
52 8 FIXUP_CASE1(2) FIXUP_CASE2(2) FIXUP_CASE3(2) FIXUP_CASE4(2) FIXUP_CASE5(2) P.color = BLACK G.color = RED if (N is left child) rightRotation(G) else
leftRotation(G) 4
Á
RVOREPV (R
EMOÇÕES)
Como remover um nó de uma árvore PV?
Podemos usar a remoção de BST?
As remoções da BST preservam os invariantes da árvore PV?
Que tipos de remoções causma problema?
53
Á
RVOREPV (R
EMOÇÕES)
Remover uma folha vermelha (6)
Á
RVOREPV (R
EMOÇÕES)
Remover uma folha vermelha (6)
55
Á
RVOREPV (R
EMOÇÕES)
Remover um nó interno vermelho (17) com filho substituto vermelho (22)
Á
RVOREPV (R
EMOÇÕES)
Remover um nó interno vermelho (17) com filho substituto vermelho (22)
57
Á
RVOREPV (R
EMOÇÕES)
Remover um nó interno vermelho (17) com filho substituto vermelho (22)
Á
RVOREPV (R
EMOÇÕES)
Remover folha preta (11)
59
Á
RVOREPV (R
EMOÇÕES)
Remover folha preta (11)
Violação do black-height foca no irmão (sibling 1) e sobrinho mais proximo (6)
Á
RVOREPV (R
EMOÇÕES)
Remover nó interno preto (13) com substituto preto (15)
61
Á
RVOREPV (R
EMOÇÕES)
Remover nó interno preto (13) com substituto preto (15)
Violação do black-height foca no irmao (25) e sobrinho mais proximo(22)
R
EFERÊNCIAS Capítulo 14
1a edição