Buscar

Prévia do material em texto

Estruturas de Dados
Lineares
Lista	
Estática (com array)
Dinâmica (encadeada)
Filas, Pilhas, Deque
Hierárquicas
Árvores
Árvores Binárias
Árvores Binárias de Busca
Árvores Binárias de Busca Balanceada
Árvores B
Elements [ ] 
	null	null	null	null	null
capacity
next
next
next
next
O1
next
O2
O3
O4
O0
head
Estática (Lista com Array)
Dinâmica (Lista Encadeada)
Listas
Variações de Listas Encadeadas
next
previous
O0
next
previous
O1
next
previous
O2
next
previous
O3
next
previous
O4
Listas Duplamente Encadeada Circular
head
next
previous
O0
next
previous
O1
next
previous
O2
next
previous
O3
next
previous
O4
Listas Duplamente Encadeada
head
next
next
next
next
next
Listas Encadeada Circular
O1
O2
O3
O4
O0
head
3
next
next
next
next
O1
next
O2
O3
O4
O0
front
rear
Filas
next
next
next
next
O1
next
O2
O3
O4
O0
top
Pilhas
Tipos Especiais de Listas
inserção
remoção
remoção
inserção
Árvores
A
B
C
D
E
F
G
H
I
J
K
L
M
N
P
Q
Árvores (definições)
Toda árvore possui um único nó raiz
Todo nó (exceto o nó raiz) possui um único pai
Um nó pode ter um número arbitrário de filhos
Nós que não possuem filhos são chamados de nós folha
Nós que possuem o mesmo pai são chamados de irmãos
Relações do tipo avô, neto e primos podem ser definidas de forma similar 
 
A
B
C
D
E
F
G
H
I
J
K
L
M
N
P
Q
Pai(A,B)
Pai(D,H)
Irmão(D,E)
Primo(H,I)
Avô(A,I)
raiz
folha
folha
folha
folha
folha
folha
folha
folha
folha
folha
Árvores (mais definições)
Uma árvore é uma coleção de N nós e N-1 arestas.
O caminho do nó n1 até o nó nk é definido como a sequência dos nós n1, n2,...,nk de tal forma que ni é pai de ni+1 para 1≤i ≤k
O comprimento de um caminho é igual ao número de arestas entre os nós extremos 
A
B
C
D
E
F
G
H
I
J
K
L
M
N
P
Q
Caminho(A,Q)=A,E,J,Q
Comprimento(Caminho(A,Q))=3
Comprimento(Caminho(A,A))=0
Árvores (mais definições)
A profundidade de um nó ni é o comprimento do único caminho entre o nó raiz e o nó ni (a profundidade do nó raiz é 0)
A altura de um nó ni é o comprimento do maior caminho entre o nó ni e um nó folha (a altura dos nós folhas é 0)
A altura de uma árvore é igual a altura do nó raiz
A profundidade de uma árvore é igual a maior profundidade entre os nós folhas
A
B
C
D
E
F
G
H
I
J
K
L
M
N
P
Q
Profundidade(A)=?
Profundidade(E)=?
Profundidade(J)=?
Profundidade(P)=?
Altura(A)=?
Altura(E)=?
Altura(J)=?
Altura(P)=?
Árvores (mais definições)
A profundidade de um nó ni é o comprimento do único caminho entre o nó raiz e o nó ni (a profundidade do nó raiz é 0)
A altura de um nó ni é o comprimento do maior caminho entre o nó ni e um nó folha (a altura dos nós folhas é 0)
A altura de uma árvore é igual a altura do nó raiz
A profundidade de uma árvore é igual a maior profundidade entre os nós folhas
A
B
C
D
E
F
G
H
I
J
K
L
M
N
P
Q
Profundidade(A)=0
Profundidade(E)=1
Profundidade(J)=2
Profundidade(P)=3
Altura(A)=3
Altura(E)=2
Altura(J)=1
Altura(P)=0
Árvores de Busca Binária
Árvores Binárias
Definição
Uma árvore binária é uma coleção de zero ou mais elementos. Para árvores binárias não vazias, a árvore é formada por um nó especial (raiz) e zero, uma ou duas sub-árvores binárias. Cada sub-árvore possui uma ligação direta com o nó raiz.
Raiz
AE
AD
Árvore de Busca Binária
Uma importante aplicação de árvores binárias é o processo de busca.
Uma árvore binária de busca possui a seguinte propriedade:
Para qualquer elemento X na árvore:
 os elementos na sub-árvore esquerda são menores que X
 os elementos na sub-árvore direita são maiores que X. 
6
8
2
4
3
1
6
8
2
4
3
1
7
Árvore Binária de Busca
Árvore Binária
<6
>6
<2
>2
<4
<6
12
Operações em Árvore de Busca Binária
Esvaziar a árvore
Testar se a árvore está vazia
Procurar um elemento na árvore
Procurar o menor elemento na árvore
Procurar o maior elemento na árvore
Inserir um elemento na árvore
Remover um elemento da árvore
Imprimir a árvore
13
Especificação do TAD Árvore de Busca Binária
class BinarySearchTree {
BinarySearchTree( )
 // Efeito: Inicializa this como uma arvore vazia de Objects
void clear( )
 // Efeito: Esvazia a árvore
bool isEmpty( )
 // Efeito: testa se a árvore está vazia
bool find(x)
 // Efeito :Retorna o elemento true caso x esteja na árvore e false, caso contrário
int findMin( )
 // Efeito: Retorna o elemento com o menor valor na árvore
int findMax( )
 // Efeito: Retorna o elemento com o maior valor na árvore 
void insert(x)
 // Efeito: Insere um nó com o elemento x na árvore
void remove(x)
 // Efeito: Remove o nó contendo o elemento x na árvore
void print( ) 
 // Efeito: Imprime os elementos da árvore em ordem crescente
}
14
Criação de Árvores de Busca Binária
MinhaABB
root
int main(int argc, char** argv) {
	BinarySearchTree MinhaABB=BinarySearchTree();
 	
	
	
	return 0;
}
15
Inserção em Árvores de Busca Binária
MinhaABB
root
6
L
R
int main(int argc, char** argv) {
	BinarySearchTree MinhaABB=BinarySearchTree();
 	MinhaABB.insert(6);
	
	return 0;
}
16
Inserção em Árvores de Busca Binária
MinhaABB
root
6
L
R
8
L
R
int main(int argc, char** argv) {
	BinarySearchTree MinhaABB=BinarySearchTree();
 	MinhaABB.insert(6);
 	MinhaABB.insert(8);
	
	return 0;
}
17
Inserção em Árvores de Busca Binária
MinhaABB
root
6
L
R
8
L
R
2
L
R
int main(int argc, char** argv) {
	BinarySearchTree MinhaABB=BinarySearchTree();
 	MinhaABB.insert(6);
 	MinhaABB.insert(8);
	
	MinhaABB.insert(2);
	return 0;
}
18
Inserção em Árvores de Busca Binária
MinhaABB
root
6
L
R
8
L
R
2
L
R
4
L
R
int main(int argc, char** argv) {
	BinarySearchTree MinhaABB=BinarySearchTree();
 	MinhaABB.insert(6);
 	MinhaABB.insert(8);
	
	MinhaABB.insert(2);
 MinhaABB.insert(4);
	return 0;
}
19
6
8
2
4
3
1
MinhaABB
root
Busca em Árvores Binárias (Mínimo)
int main(int argc, char** argv) {
	BinarySearchTree MinhaABB=BinarySearchTree();
 	...
	MinhaABB.findMin()
	return 0;
}
20
Busca em Árvores Binárias (Máximo)
6
8
2
4
3
1
MinhaABB
root
int main(int argc, char** argv) {
	BinarySearchTree MinhaABB=BinarySearchTree();
 	...
	MinhaABB.findMax()
	return 0;
}
21
Remoção em Árvore de Busca Binária
Caso 1 – O nó a ser removido é um nó folha
6
8
2
4
3
1
6
8
2
4
1
remove(3)
22
Remoção em Árvore de Busca Binária
Caso 2 – O nó a ser removido possui um único filho
6
8
2
4
3
1
remove(4)
6
8
2
4
3
1
23
Remoção em Árvore de Busca Binária
Caso 3 – O nó a ser removido possui dois filhos
6
8
2
4
3
1
remove(2)
6
8
3
4
3
1
A estratégia é simples: 
Troca o elemento do nó a ser removido com o menor nó da sub-árvore direita
Recursivamente, remove o nó remanejado da sub-árvore
24
Percurso em Árvores
A estratégia para se percorrer uma árvore binária é dividida em três grandes grupos:
Percurso em pré-ordem
Nós pais são processados antes dos seus filhos
Percurso em pós-ordem 
Nós filhos são processados antes dos seus pais
Percurso em ordem 
O processamento é feito na ordem filho esquerdo-pai-filho direito
Um Exemplo
8 4 3 6 5 7 15 12 16 10 14 9 11
8
4
15
3
6
5
7
12
16
10
14
9
11
Percurso Pós-Ordem
Nós filhos são processados antes dos seus pais
8
4
3
6
5
7
15
16
12
14
10
9
11
3 5 7 6 4 9 11 10 14 12 16 15 8
Percurso Pré-Ordem
Nós pais são processados antes dos seus filhos
8
4
3
6
5
7
15
16
12
14
10
9
11
8 4 3 6 5 7 15 12 10 9 11 14 16
29
Percurso em Ordem
O processamento é feito na ordem filho esquerdo-pai-filho direito
8
4
3
6
5
7
15
16
12
14
10
9
11
3 4 5 6 7 8 9 10 11 12 14 15 16
Propriedades de Árvores Binárias
A complexidade da maioria das operações em árvores é proporcional a profundidade da árvore.
Em geral as árvores binárias possuem profundidade menor do que n.
No pior caso, a árvore possui profundidade n-1
Em média, a profundidade das árvores binárias é O(√n) 
Em alguns casos especiais (árvores binárias de busca) a profundidade é em média O(logn)
A
B
C
D
E
F
G
Pior Caso
A
C
B
D
E
G
FMelhor Caso

Mais conteúdos dessa disciplina