Estruturas de Dados

Propaganda
Estruturas de Dados
Árvores
Prof. Rodrigo Rocha
[email protected]
http://www.bolinhabolinha.com
Onde Estamos ?
 Ementa
•
•
•
•
•
•
•
•
•
Introdução à estrutura de dados.
Alocação estática de memória
memória.
Alocação dinâmica de memória.
Pilhas.
Filas.
Listas
Listas.
Algoritmos recursivos.
Árvores.
Grafos.
1
Árvores
 É uma estrutura de dados hierárquica
• Exemplo
 chave de times em um campeonato
 árvore genealógica
 organograma funcional
 Componentes
•
•
•
•
•
•
raiz (root) – nó superior
aresta – linha que liga os nós
folhas – nós filhos
floresta – conjunto de árvores
grau do nó - número de nós filhos
grau da árvore - é o máximo entre os graus de seus nós
Árvores
 Operações
 procura, predecessor, antecessor, mínimo, máximo,
inserir e deletar
Idealmente, temos
– Árvore balanceada
» Red black, avl, b tree
– Altura: log n para n nós
 armazenamento
– Muito g
grande p
para RAM
– Parte em RAM, parte em méio magnético
» Meio magnético + lento
2
Árvores binárias
 Estrutura de dados: árvore
• cada nó tem no máximo duas sub árvores
• Operações
 procura, predecessor, antecessor, mínimo, máximo, inserir e
deletar
 Tempo é proporcional a altura da árvore
 Estrututa
•
•
•
•
Campo chave
Campo esquerdo
Campo direito
P = pai
 Se algum filho ou pai estiver ausente, o campo
conterá nulo
• O nó raiz é o único que contém o campo pai nulo
Árvores binárias
 Implementando em um vetor
• Array com 7 posições:
• Armazenamento por nível:
• posição do nó
1
2
3
i
posição dos filhos do nó
2,3
4,5
6,7
(2i,2i+1)
3
Árvores binárias
 Implementando em uma estrutura
• campo do valor
• 2 ponteiros : para o filho da esquerda e direita
• Estrutura (exemplo)
typedef struct sttNo {
tipo inf;
struct sttNo *esq, *dir;
} tNo;
Árvores binárias
 Procedimento para imprimir todos os
elementos de uma árvore binária
INORDER-TREE-WALK(x)
( )
if x ≠ NIL
then INORDER-TREE-WALK(left[x])
print key[x]
INORDER-TREE-WALK(right[x])
4
Árvore Binária de Pesquisa
 Árvore binária de pesquisa
• nós são distribuídos de forma a facilitar a
pesquisa
• Para qualquer nó x
elementos a esquerda são menores que o elemento
pai
elementos a direita são maiores que o elemento pai
Árvores binárias
 Pesquisando
TREE-SEARCH(x, k)
if x = NIL or k = key[x]
then return x
if k < key[x]
then return TREE-SEARCH(left[x], k)
else return TREE-SEARCH(right[x], k)
 Chamada inicial: TREE-SEARCH(root[T ], k).
 Para procurar a chave 13
• 15-6-7-13
5
Árvores binárias
 Versão não recursiva do algoritmo
ITERATIVE-TREE-SEARCH(x, k)
1 while x ≠ NIL and k ≠ key[x]
2
do if k < ke
key[x]
[ ]
3
then x ← left[x]
4
else x ← right[x]
5 return x
Árvores binárias
 Máximo e mínimo valor
 TREE-MINIMUM(x)
while left[x] = NIL
do x ← left[x]
return x
 TREE-MAXIMUM(x)
while right[x] = NIL
do x ← right[x]
return x
6
Árvores binárias
 Sucessor e Predecessor
• TREE-SUCCESSOR(x)
if right[x] = NIL
then return TREE-MINIMUM(right[x])
( g [ ])
else y ← p[x]
while y = NIL and x = right[y] do
x ← y
y ← p[y]
return y
• Atenção:
 Os algoritmos de sucessor, mínimo, máximo e predecessor não procuram
pelos valores
Árvores binárias
 Inserção
• ache a folha que será inserido o nó
• conecte o nó ao pai da folha
 Algortimo
• TREE-INSERT (T, z)
• y ← NIL
x ← root [T]
while x ≠ NIL do
y ← x
if key [z] < key[x]
then x ← left[x]
else x ← right[x]
p[z] ← y
if y = NIL
then root [T] ← z
else if key [z] < key [y]
then left [y] ← z
else right [y] ← z
7
Árvores binárias
 Remoção
• nó sem filhos
somente ajustamos o ponteiro do nó pai
Árvores binárias
 Remoção
• nó com um único filho
mover o filho para a posição do nó pai
8
Árvores binárias
 Remoção
• nó com dois filhos
 procuramos o sucessor (ou predecessor), que deverá ocupar o
seu lugar
l
– nó mais a esquerda da sub-árvore da direita
– como ele não tem filhos a esquerda, a sua sub-árvore a direita pode
ser movida
Árvores binárias
 Remoção Algoritmo
TREE-DELETE (T, z)
if left [z] = NIL
.OR.
right[z] = NIL
then y ← z
else y ← TREE-SUCCESSOR (z)
if left [y] ≠ NIL
then x ← left[y]
else x ← right [y]
if x ≠ NIL
then p[x] ← p[y]
if p[y] = NIL
then root [T] ← x
else if y = left [p[y]]
th
then
l
left
ft [
[p[y]]
[ ]] ← x
else right [p[y]] ← x
if y ≠ z
then key [z] ← key [y]
if y has other field, copy them, too
return y
9
Árvores binárias
 Exercício
• Para a árvore abaixo representada, responda as
seguintes questões:
• Número de elementos
• Altura
• Elemento Root (Pai)
• Elementos folhas
Árvores binárias - exercícios
 1-) Desenhe a árvore de pesquisa binária, com os itens
S,U,P,E,R,F,A,C,I,L. Onde cada nó tenha somente uma letra.
 2
2-)) (12.1.1
(12 1 1 C
Cormen):
) T
Trace as á
árvores d
de pesquisa
i bi
binária
ái d
de
altura 2,3,4,5 e 6 sobre o conjunto de chaves
{1,4,5,10,16,17,21}
 3-) Para a árvore binária abaixo, mostre os elementos que
serão mostrados, utilizando o algoritmo INORDER-TREEWALK(x)
10
Exercícios
 4-) Escreva o algortimo tree-predecessor.
Exercícios
 6-) Para a seguinte árvore binária, responda
as questões
a-)) Mostre os nós q
que são p
percorridos p
para achar o nó com valor 9. O q
que o algoritmo
g
retornou?
b-) Mostre os nós que são percorridos para achar o nó com valor 8. O que o algoritmo retornou?
c-) Ache o sucessor de 15. (Mostre os nós que o algoritmo percorreu)
d-) Ache o sucessor de 6 . (Mostre os nós que o algoritmo percorreu)
e-) Ache o sucessor de 4 . (Mostre os nós que o algoritmo percorreu)
f-) Ache o predecessor de 6 . (Mostre os nós que o algoritmo percorreu)
g-) Insira o valor 19. (Mostre os nós que o algoritmo percorreu)
h-) Insira o valor 1. (Mostre os nós que o algoritmo percorreu)
i-) Remova o nó com valor 13. Desenhe o novo layout da árvore
j-) Remova o nó com valor 6. Desenhe o novo layout da árvore
11
Exercícios
 7-) (12.2.1 Cormen) Suponha que você tenha os
números de 1 a 1000 em uma árvore binária de
busca, e quer localizar o número 363. Qual
seqüência abaixo não pode ser a seqüência de nós
examinados?
 a-) 2, 252, 401, 398, 330, 344, 397, 363.
 b-) 924, 220, 911, 244, 898, 258, 362, 363.
 c-) 925, 202, 911, 240, 912, 245, 363.
 d-) 2, 399, 387, 219, 266, 382, 381, 278, 363.
 e-) 935, 278, 347, 621, 299, 392, 358, 363.
 8-) Escreva um algoritmo que traga a soma de todos
os valores de uma árvore. Qual a sua
complexidade? Justifique.
Demo
 Animações na web
• http://www.engin.umd.umich.edu/CIS/course.des/
cis350/treetool/
• http://www.cosc.canterbury.ac.nz/mukundan/dsal/
BSTNew.html
• htt
http://www.cosc.canterbury.ac.nz/mukundan/dsal/
//
t b
/ k d /d l/
BST.html
12
Bibliografia

Livro texto
• TENENBAUM, Aaron M; SOUZA, Tereza Cristina Félix de.
Estruturas de Dados usando C. 1ª ed. São Paulo: Makron
,
Books,1995.
•
PEREIRA, Silvio do Lago. Estrutura de Dados Fundamentais :
conceitos e aplicações. 9ª ed. São Paulo: Érica, 2006.
•
VELOSO, Paulo A. S.. Estrutura de Dados. 1ª ed. São Paulo:
Campus, 1983.

Complementar
•
•
•
•
VILLA, Marcos Vianna. Estrutura de Dados : conceitos e técnicas de
implementação. 1ª ed. Rio de Janeiro: Campus, 1993.
WIRTH, Niklaus. Algoritmos e estruturas de dados. 1ª ed. Rio de
Janeiro: LTC, 1999
CORMEN, Thomas H.. ALGORITMOS : TEORIA E PRÁTICA. 2ª ed. Rio
de Janeiro: CAMPUS, 2002
SCHILDT, Herbert. C Completo e Total. 3ª ed. São Paulo: Pearson
Education, 2005
13
Download