Professional Documents
Culture Documents
O TAD Árvore
Operações Genéricas: Operações de Consulta:
size(T): no. de nós da árvore. isInternal(T, p): Nó p é interno ?
isEmpty(T): árvore T vazia ? isExternal(T, p): Nó p é externo ?
1
TAD Árvore Binária
O TAD Árvore Binária estende o TAD árvore, ou seja, herda
todas as suas operações.
Operações Adicionais:
leftChild(T, p): retorna referência para o nó filho esquerdo do nó
referenciado por p ou para nulo (p. ex. se p é externo).
expandExternal(T, v) removeAboveExternal(T, w)
v v
A A A B
∅ ∅ B C w
Permitem construir ou destruir completamente qualquer árvore binária!
4
2
Estrutura em Arranjo para Árvores Binárias
Utiliza o conceito de função
numeradora por nível: 1
3
Estrutura em Arranjo para ABs
Resumo:
a
1 2 3 4 5 6 7 ...
b c
a b c d e f g ...
d e f g
Vantagens:
Simplicidade
Espaço apenas para armazenar conteúdo (elementos)
ligações estão implícitas nos valores dos índices
Desvantagens:
Espaços vagos se árvore não é completa
Inadequada para árvores com tamanho variável
4
Tempos de Execução nas Duas Implementações
A D F
∅ ∅
C E
C E
10
5
O(n), onde
n é o no.
Percurso Pré-Fixado de nodos
Um “percurso” visita os nodos de Algoritmo PreOrder(T, v)
uma árvore de forma sistemática. visite(T, v)
travessia ou caminhamento se isInternal(T, v) então
Em um percurso pré-fixado, um para w ∈ children(T, v) faça
nodo é visitado antes dos seus PreOrder(T, w)
descendentes. * Acesso seqüencial à lista children a
partir do primeiro filho.
Exemplo de Aplicação:
imprimir doc. estruturado 1
Documento
2 5 9
Capítulo 1 Capítulo 2 Referências
3 4 6 7 8
Seção 1.1 Seção 1.2 Seção 2.1 Seção 2.2 Seção 2.3
Percurso Pré-Fixado
Caso Particular
Árvores Binárias
Algoritmo PreOrder(T, v)
visite(T, v)
se isInternal(T, v) então
PreOrder(T, leftChild(T, v))
PreOrder(T, rightChild(T, v))
* Chamada: PreOrder(T, root(T))
6
O(n), onde
n é o no.
Percurso Pós-Fixado de nodos
Em um percurso pós-fixado, um Algoritmo PosOrder(T, v)
nodo é visitado após seus
se isInternal(T, v) então
descendentes.
para w ∈ children(T, v) faça
Útil quando alguma propriedade de
um nodo depende da propriedade PosOrder(T, w)
dos seus descendentes. visite(T, v)
* Acesso seqüencial à lista
Exemplo de Aplicação: children a partir do primeiro filho.
calcular o espaço utilizado em 9
árvores de arqs e diretórios.
cs16/
8
3 7
todo.txt
homeworks/ programs/
1K
1 2 4 5 6
h1c.doc h1nc.doc DDR.java Stocks.java Robot.java
3K 2K 10K 25K 20K 13
Percurso Pós-Fixado
Caso Particular
Árvores Binárias
Algoritmo PosOrder(T, v)
se isInternal(T, v) então
PosOrder(T, leftChild(T, v))
PosOrder(T, rightChild(T, v))
visite(T, v)
* Chamada: PosOrder(T, root(T))
7
Avaliação de Expressões Aritméticas
Especialização de um Algoritmo EvalExpr(T, v)
percurso pós-fixado: se isInternal(T, v) então
x ← EvalExpr(T, leftChild(T, v))
visite(T, v) calcula e
y ← EvalExpr(T, rightChild(T, v))
retorna a op. x ◊ y se v
◊ ← elem(T, v)
for interno, c.c. retorna o
valor armazenado em v. retorne x ◊ y
senão retorne elem(T, v)
+ * Chamada: EvalExpr(T, root(T))
× ×
2 − 3 2 Árvores
Binárias
5 1
PS. Assume disponível no TAD AB operação elem(T, v), que retorna info. do nó referenciado por v.
Percurso Inter-Fixado
Em um percurso inter- Algoritmo InOrder(T, v)
fixado um nodo é visitado se isInternal(T, v) então
após sua sub-árvore InOrder(T, leftChild(T, v))
esquerda e antes da sua
sub-árvore direita. visite(T, v)
se isInternal(T, v) então
Exemplo de Aplicação:
InOrder(T, rightChild(T, v) )
Percurso não decrescente * Chamada: InOrder(T, root(T))
em uma árvore binária de
busca onde cada nodo 6
interno armazena um
elemento maior (menor) ou 2 8
igual aos elementos
armazenados na sua sub- 1 4 7 9
árvore esquerda (direita).
3 5
16
8
Exercícios
Escreva um algoritmo em pseudo-código que receba
uma árvore T e uma referência para um nó da árvore,
retornando a profundidade daquele nó na árvore.
17
Exercícios
Faça um algoritmo em pseudo-código para cálculo da altura de
uma árvore binária própria T recebida como parâmetro:
18
9
Exercícios
Seja a seguinte expressão aritmética:
( −27 / ( ( 2 × (a + 8) ) − ( (3 × b) + 18 ) ) ) / ( c − 10 )
Represente essa expressão em uma árvore estritamente binária
de expressão aritmética.
Exercícios
Implemente o TAD Árvore Binária em Linguagem C:
Via ED estática (arranjo).
Via ED dinâmica.
Faça a implementação de um dos TADs acima de modo a
armazenar números inteiros nos nodos da árvore. Então
implemente operações para imprimir todos esses números via:
Percurso pré-fixado.
Percurso pós-fixado.
Percurso inter-fixado.
Nota: Cada visita deve imprimir o valor do nó correspondente.
20
10
Bibliografia
M. T. Goodrich & R. Tamassia, Estruturas de Dados e
Algoritmos em Java, Bookman, 2002
11