1
E
STRUTURASDED
ADOS EA
LGORITMOSÁ
RVOREB
INÁRIA Adalberto CajueiroDepartamento de Sistemas e Computação Universidade Federal de Campina Grande
1
Á
RVORE(E
XEMPLO)
Como seria pesquisar
a localização de um arquivo no
windows explorer se não
tivéssemos diretórios?
Para entradas realmente grandes, o acesso linear é proibitivo!
Precisamos de alguma estrutura nao-linear de
2
Á
RVORE Estrutura não-linear com tempo de acesso em média O(log n).
Coleção de nós em hierarquia
Vazia ou
Raiz (root) e zero ou mais subárvores
Raiz da subárvore é um nó filho do nó raiz
A raiz de uma árvore é unica!
Não possui ciclos
N nós, N-1 arestas
3
Á
RVORE(I
LUSTRACAO)
raiz
...
raiz
root
3
Á
RVORE(I
LUSTRACAO)
raiz
...
folha (leaf)
5
6
Á
RVOREraiz
...
Nível 0
Nível 1
Nível k
Nível k + 1
4
Á
RVORE
Uma
árvore binária
é uma estrutura de
dados caracterizada por:
Ou não tem elemento algum (árvore vazia)
Ou tem um elemento distinto, denominado raiz, com duas referencias para duas
estruturas diferentes, denominadas sub-árvore (filho) esquerda e sub-árvore (filho) direita
Cada nó pode ter grau: 0, 1 ou 2
7
Á
RVORE A ligação entre os nós são vistas como
apontadores direcionados do pai para os filhos.
Por questoes de implementação apontadores podem
existir também dos filhos para o pai
O numero de filhos por nó diferenciam os vários tipos de arvores existentes.
Cada nó da árvore encontra-se em determinado nível. A raiz encontra-se no nível zero.
Propriedade fundamental: só existe um caminho da raiz para um outro nó da árvore.
Altura de uma árvore: comprimento do caminho mais longo da raiz até as folhas
5
Á
RVORE(A
PLICABILIDADE)
Representacao de expressoes aritméticas
5*3 + 4/2
+
* /
5 3 4 2
9
E
XERCÍCIOQual a profundidade do nó 6?
Qual a altura da árvore?
Os nós 6 e 9 estão no mesmo nível? e 7 e 11?
Qual o grau do nó 7? E de 9? E de 4?
6
Á
RVORESE
STRITAMENTEB
INÁRIAS Cada nó possui grau 0 ou 2
Quantos nós terá uma AEB com n folhas?
7
4
9
1
6
3
2
Desenhe diversas arvores e tente deduzir.
11
E
XERCÍCIO A árvore a seguir é estritamente binária? Justifique.
7
Á
RVOREB
INÁRIAC
OMPLETA
Todos os níveis são completos (folhas estão
no mesmo nível)
Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos em cada nível?
Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos no total?
nível 0 – nos:1 – total:1
nível 1 – nos:2 – total:3
nível 2 – nos:4 – total:7
nível 3 – nos:8 – total:15
13
Á
RVOREB
INÁRIAC
OMPLETA
Todos os níveis são completos (folhas estão
no mesmo nível)
Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos em cada nível?
Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos no total?
nível 0 – nos:1 – total:1
nível 1 – nos:2 – total:3
nível 2 – nos:4 – total:7
nível 3 – nos:8 – total:15
h 2h 2h+1 - 1
8
Á
RVORESB
INÁRIAS(P
ERCURSOS)
Formas de percurso em árvore binárias:
Pré-ordem (RAIZ, ESQ, DIR)
Visita raiz
Percorre sub-árvore esquerda em pré-ordem
Percorre sub-árvore direita em pré-ordem
Em-ordem (simétrica) (ESQ, RAIZ, DIR)
Percorre sub-árvore esquerda em ordem simétrica Visita raiz
Percorre sub-árvore direita em ordem simétrica Pós-ordem (ESQ, DIR, RAIZ)
Percorre sub-árvore esquerda em pós-ordem
Percorre sub-árvore direita em pós-ordem Visita raiz
Applet:
http://www.cosc.canterbury.ac.nz/mukundan/dsal/BTree.html
15
A
RVORES BINÁRIAS Impressão em pré-ordem (R,E,D):
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
9
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15 8
17
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15 8,4
10
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15 8,4,2
19
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15 8,4,2,1
11
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15 8,4,2,1,3
21
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15 8,4,2,1,3,6
12
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15 8,4,2,1,3,6,5
23
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15 8,4,2,1,3,6,5,7
13
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15 8,4,2,1,3,6,5,7, 12
25
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
8,4,2,1,3,6,5,7, 12,10
14
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
8,4,2,1,3,6,5,7, 12,10,9
27
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
8,4,2,1,3,6,5,7, 12,10,9,11
15
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
8,4,2,1,3,6,5,7, 12,10,9,11,14
29
A
RVORES BINÁRIAS Impressão em pré-ordem:
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
8,4,2,1,3,6,5,7, 12,10,9,11,14,13
16
E
XERCÍCIO Qual a saída do caminhamento em pré ordem da árvore binária a seguir?
31
32
A
RVORES BINÁRIAS Impressão em ordem simétrica (E,R,D):
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
17
E
XERCÍCIO Qual a saída do percurso em ordem da árvore binária a seguir?
33
34
A
RVORES BINÁRIAS Impressão em pós-ordem (E,D,R):
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
18
E
XERCÍCIO Qual a saída do caminhamento em pós ordem da árvore binária a seguir?
35
Á
RVOREB
INÁRIA(I
MPLEMENTAÇÃO)
De que é composta uma árvore binária?
Como implementar uma árvore binária?
19
Á
RVOREB
INÁRIA(I
MPLEMENTAÇÃO)
De que é composta uma árvore binária?
Como implementar uma árvore binária?
public class BTNode<T> { protected T data;
protected BTNode<T> left; protected BTNode<T> right; protected BTNode<T> parent;
public boolean isEmpty(){ return this.data == null;
}
//getters, setters, equals, toString
}
37
Á
RVOREB
INÁRIA(I
MPLEMENTAÇÃO)
De que é composta uma árvore binária?
Como implementar uma árvore binária?
public interface BT<T> { public BTNode<T> getRoot(); public boolean isEmpty(); public int height();
public BTNode<T> search(T elem); public void insert(T value);
public void remove(T key); public T[] preOrder(); public T[] order(); public T[] postOrder(); public int size();
}
20
Á
RVOREB
INÁRIA(I
MPLEMENTAÇÃO)
Como representar uma árvore vazia?
O construtor default de BTNode já gera uma árvore vazia?
data = null
null null
null
39
Á
RVOREB
INÁRIA(I
MPLEMENTAÇÃO)
Como representar uma árvore vazia?
O construtor default de BTNode já gera uma árvore vazia?
data = null
null null
null
=
NIL
O nó sentilena de uma árvore binária não contem dados
21
Á
RVOREB
INÁRIA(I
MPLEMENTAÇÃO)
Como representar uma árvore contendo apenas um nó?
data
NIL NIL
null
data
null
null
null null
null
null null
folha folha
41
Á
RVOREB
INÁRIA DEB
USCA Árvore binária de busca ou árvore binária de pesquisa é uma árvore bináriaonde todos os nós armazenam dados comparáveis
todos nós da sub-árvore à esquerda contêm valores menores do que o nó raiz
todos os nós da subárvore à direita contêm valores maiores do que o nó raiz.
A principal utilização de árvores binárias são as árvores bináriade busca
x
< x > x
22
E
XEMPLO2 Subárvores
>
>
>
<
<
O quanto isso reduz o espaço da busca a cada passo?
43
Á
RVOREB
INÁRIA DEB
USCA(I
MPLEMENTAÇÃO)
Uma BST é uma BT?
Como implementar isso em Java?
23
Á
RVOREB
INÁRIA DEB
USCA(I
MPLEMENTAÇÃO)
Uma BST é uma BT?
Como implementar isso em Java?
45
public class BSTNode<T extends Comparable<T>> extends BTNode<T> {
}
Á
RVOREB
INÁRIA DEB
USCA(I
MPLEMENTAÇÃO)
Uma BST é uma BT?
Como implementar isso em Java?
46
public interface BST<T extends Comparable<T>> extends BT<T> {
public BTNode<T> maximum(); public BTNode<T> minimum();
public BTNode<T> successor(BTNode<T> node); public BTNode<T> predecessor(BTNode<T> node);
24
P
ESQUISAB
INÁRIA
Como saber se um dado/valor/chave está
na árvore?
Se o nó é não-vazio
Verifica se o dado do nó é igual à chave dada
Se nao for
Se a chave dada for menor que o dado do nó, pesquisa na sub-árvore a esquerda
Senao pesquise na sub-árvore a direita
47
P
ESQUISAB
INÁRIA(I
MPLEMENTACAO)
Qual o custo dos algoritmos?
25
Á
RVORED
ESBALANCEADA O que ocorre com a pesquisa binária se a árvore estiver desbalanceada?
42
88
94
95
x
< x
> x
49
Á
RVORED
ESBALANCEADA O que ocorre com a pesquisa binária se a árvore estiver desbalanceada?
42
88
94
95
O(n)
Solução: Outras árvores, como
AVL, que veremos depois.
x
< x
> x
26
M
INIMUM
Como buscar o elemento mínimo de uma
BST?
Descer pela esquerda até que um NIL seja encontrado
51
M
AXIMUM
Como buscar o elemento máximo de uma
BST?
Descer pela direita até que um NIL seja encontrado
27
S
UCESSOR
Como buscar o sucessor de um elemento
em uma BST?
Sucessor é a menor das chaves maiores (menor descendente a direita)
53
S
UCESSOR
Como buscar o sucessor de um elemento
em uma BST?
Sucessor é a menor das chaves maiores (primeiro ascendente maior)
28
P
REDECESSOR
Como buscar o predecessor de um
elemento em uma BST?
Predecessor é a maior das chaves menores (maior descendente a esquerda). Simétrico ao sucessor
Tree-Predecessor(x) if left[x] != NIL
then return Tree-Maximum(left[x]) y = p[x]
while y != NIL and x = left[y] do x = y
y = p[y]
return y 55
P
REDECESSOR
Como buscar o predecessor de um
elemento em uma BST?
Predecessor é a maior das chaves menores (primeiro ascendente maior). Simétrico ao sucessor
Tree-Predecessor(x) if left[x] != NIL
then return Tree-Maximum(left[x]) y = p[x]
while y != NIL and x = left[y] do x = y
y = p[y]
29
Á
RVOREB
INÁRIA(I
NSERÇÃO)
Acontece pela raiz (admitir elementos diferentes)
Processar apenas chaves diferentes da raiz
Se a chave for menor, insere no filho a esquerda
Se a chave for maior insere no filho a direita
Insercao sempre acontece em uma nova folha
57
E
XERCÍCIO1
Insira as chaves 46, 47, 44, 45
30
E
XERCÍCIO1
Insira as chaves 46, 47, 44, 45
59
46
E
XERCÍCIO1
Insira as chaves 46, 47, 44, 45
60
46
31
E
XERCÍCIO1
Insira as chaves 46, 47, 44, 45
61
46
47 44
E
XERCÍCIO1
Insira as chaves 46, 47, 44, 45
62
46
47 44
32
Á
RVOREB
INÁRIA(I
NSERCAO)
O procedimento recebe um nó mas poderia receber V
x guarda o nó onde inserir e
y guarda o pai
63
Á
RVOREB
INÁRIA(I
NSERCAO)
O procedimento recebe um nó mas poderia receber V
Para que serve?
33
Á
RVOREB
INÁRIA(I
NSERCAO)
O procedimento recebe um nó mas poderia receber V
Se a arvore é inicialmente vazia ou entao adiciona z como filho correto de y
65
Á
RVOREB
INÁRIA(I
NSERCAO)
O que o método a seguir faz?
XYZ(BSTNode node, T element){ if(node=NIL){
node.data = element node.left = NIL node.right = NIL }else{
if(element< node.data){ XYZ(node.left, element) }else if (element > node.data){ XYZ(node.right, element) }
} }
34
A
RVORESB
INÁRIAS(R
EMOCAO)
Remocoes em arvores binarias:
Se o nó y (a ser removido) for uma folha entao remova-o.
Se o nó y tem apenas um filho, então ligamos o pai de y ao filho de y
Se tem dois filhos então traz o sucessor de y para o lugar dele e remove o sucessor
12
10 14
9 11 13 15
12
10 15
9 11 13 67
Á
RVOREB
INÁRIA(R
EMOÇÃO)
tem ao maximo 1 filho
35
Á
RVOREB
INÁRIA(R
EMOÇÃO)
Tem 2 filhos
69
Á
RVOREB
INÁRIA(R
EMOÇÃO)
Guarda o filho a direita ou a esquerda
36
Á
RVOREB
INÁRIA(R
EMOÇÃO)
Conecta o filho ao pai de y
71
Á
RVOREB
INÁRIA(R
EMOÇÃO)
Se y é root entao x é novo root
37
Á
RVOREB
INÁRIA(R
EMOÇÃO)
Senao seta x sendo o filho correto do pai de y
73
Á
RVOREB
INÁRIA(R
EMOÇÃO)
Se o sucessor de z foi um nó diferente entao copia o conteudo dele para z.
38
A
RVORESB
INÁRIAS(R
EMOCAO)
Outras abordagens trabalham da seguinte forma:
Se for folha remove
Senao sobe o menor descendente a direita (sucessor)
Se nao existir menor descendente a direita então sobe o maior descendente a esquerda (predecessor)
Remove recursivamente o nó movido.
75
A
RVORESB
INÁRIAS(R
EMOCAO)
76
39
A
RVORESB
INÁRIAS(R
EMOCAO)
77
A
RVORESB
INÁRIAS(R
EMOCAO)
78
40
A
RVORESB
INÁRIAS(R
EMOCAO)
79
remover 30
40
A
RVORESB
INÁRIAS(R
EMOCAO)
80
remover 50
41
A
RVORESB
INÁRIAS(R
EMOCAO)
81
remover 90
40
90
A
RVORESB
INÁRIAS(R
EMOCAO)
82
40
90
42
Á
RVOREB
INÁRIA(R
EMOCAO)
if(node != NIL){ if(node is leaf){
node = NIL
}else if (node has one child){
if node != root if(node is left child){ if(node.left != NIL)
node.left is left child of node.parent else
node.right is left child of node.parent else //node is right child
if(node.left != NIL)
node.left is right child of parent else
node.right is right child of parent else
root = not NIL child of root
}else{
BSTNode sucessor = sucessor(node); node.value = sucessor.value; XYZ(sucessor);
}
} }
O que o metodo faz?
83
Á
RVOREB
INÁRIA(P
ERCURSO)
Algoritmo do percurso em pre-ordem
84
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
43
Á
RVOREB
INÁRIA(P
ERCURSO)
Algoritmo do percurso em pre-ordem
preOrder(BSTNode node){ if(node != NIL){
visit(node);
preOrder(node.left); preOrder(node.right); }
}
visit(BSTNode){ print(node.key); }
Poderia fazer qualquer outro processamento
85
Á
RVOREB
INÁRIA(P
ERCURSO)
Algoritmo do percurso em ordem
86
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
44
Á
RVOREB
INÁRIA(P
ERCURSO)
Algoritmo do percurso em ordem
order(BSTNode node){ if(node != NIL){ order(node.left); visit(node); order(node.right); }
}
87
Á
RVOREB
INÁRIA(P
ERCURSO)
Algoritmo do percurso em pós-ordem
88
8
4 12
2
1 3
6
5 7
10 14
9 11 13 15
45
Á
RVOREB
INÁRIA(P
ERCURSO)
Algoritmo do percurso em pós-ordem
postOrder(BSTNode node){ if(node != NIL){
postOrder(node.left); postOrder(node.right); visit(node);
} }
89
Á
RVOREB
INÁRIA Como seria para calcular recursivamente o tamanho (quantidade de elementos) de uma árvore binária
90
1
size size
46
Á
RVOREB
INÁRIA Como seria para calcular recursivamente o tamanho (quantidade de elementos) de uma árvore binária
int size(){
return size(root) }
int size(BSTNode node){ if(node.isEmpty) return 0 else
return 1 + size(node.left) + size(node.right) }
91
POSCOMP 2009
Nao necessariamente
balanceada!
47
POSCOMP 2009
93
POSCOMP 2009
48
POSCOMP 2009
95
R
EFERÊNCIAS Capítulo 13