Você está na página 1de 26

Algoritmo e Estrutura de Dados

ÁRVORE BINÁRIA
Definição
• Árvore Binária T é um conjunto finito de
elementos denominados nós ou vértices, tal que:

– T = 0 e a árvore é dita vazia ou

– Existe um nó r, chamado raiz de T, e os nós


restantes podem ser divididos em dois
subconjuntos disjuntos, Tre e Trd, que são as
subárvores esquerda e direita de r,
respectivamente e as quais, por sua vez, também
são árvores binárias.
Árvore Binária
raiz C
esq dir
B H

A E L

G J M

Essa é a famosa Árvore Binária de Busca:


- Nós da subárvore da esquerda são menores do que a raiz
- Nós da subárvore da direita são maiores do que a raiz
Definição da Estrutura
Árvore Binária usando ponteiros

type
Ponteiro = ^TipoNo;
TipoItem = record
chave: TipoChave;
{outros componentes...}
end;
TipoNo = record
Reg: TipoItem;
esq, dir: Ponteiro;
end;
TipoArvoreBin = Ponteiro;
Característica da Árvore Binária

• Cada nó tem no máximo dois filhos;


• Filhos da esquerda têm valores menores do que a
raiz;
• Filhos da direita têm valores maiores do que a raiz;
Raiz, Subárvore esquerda e direita, Folha
raiz da árvore
8
raiz da sae raiz da sad

2 1

4 3 9 7

13 5 11

Folha
O NO que não tem filhos chama-se FOLHA.
Árvore representada como conjuntos aninhados

(A (B(D))(C(E(H)(I))(F)(G)))
Árvores Binárias de Busca

• A principal propriedade de todos os


elementos da subárvore esquerda do
nó n serem menores que o conteúdo de
n, e todos os elementos da subárvore
direita serem maiores ou iguais ao
conteúdo de n.
Vantagens

• Possuem um número constante de subárvores


em cada nó
– Limitação do número de ponteiros usados
• Algoritmos eficientes para pesquisa de dados
• A forma de armazenar os nós surge naturalmente
de sua definição:
– Ponteiro para o nó raiz (como nas listas lineares)
– Ponteiros para os filhos: esq e dir
– Necessita de 2n+1 ponteiros para representar n nós.
Árvore Binária : Nível
O nível de um nó n pode ser definido do seguinte modo: o nó
raiz tem nível 0, os outros nós tem um nível que é maior uma
unidade que o nível de seu pai

nível 0
1

nível 1
2 3

nível 2
4 5 6 7

nível 3
8 9 10
Árvore Binária : Altura

A altura de uma árvore binária é igual ao


maior nível de um nó da árvore.

nível 0
1

nível 1
2 3
Altura = 3
nível 2
4 5 6 7

nível 3
8 9 10
BALANCEAMENTO

• Uma árvore binária balanceada é aquela em


que dado um nodo qualquer da árvore a sua
subárvore à esquerda possui uma altura
igual (ou no máximo um nível superior ou
inferior) em relação a sua subárvore à direita.
Dois conceitos importantes são: altura de
um certo no, e o fator de balanceamento (FB:
diferença entre a altura da subárvore
esquerda em relação a subárvore direita).
Árvore Binária Não Balanceada
Árvore Binária Balanceada
Aplicações de Árvores Binárias: 01
Aplicações de Árvores Binárias: 02

( (3 + 6) * (4 - 1) ) + 5
Aplicações de Árvores Binárias: 03

Em 1951, a David A. Huffman e seus colegas da disciplina Teoria da


Informação, no MIT, foram dadas a opção de fazer uma monografia ou um
exame final. Seu professor, Robert M. Fano, designou um trabalho com a
tarefa de se encontrar a codificação binária mais eficiente. Huffman, sem
conseguir demonstrar que qualquer código que havia feito era o mais
eficiente, estava à beira de começar a estudar para o exame final, até que
teve a ideia de usar uma árvore binária utilizando frequências relativas para
fazer a demonstração que precisava.

Com isso, Huffman conseguiu fazer um código mais eficiente que seu
professor, que trabalhava em Teoria da Informação com o próprio pioneiro
dessa área do conhecimento, Claude Shannon. Construindo a árvore de
codificação binária na metodologia bottom-up ao invés do top-down que a
Codificação de Shannon-Fano utiliza.
Aplicações de Árvores Binárias: 03
• Algoritmo de Huffman
Operações Básicas da Árvore Binária

1. Inicializa(Arvore): define um arvore vazia


2. CriarRaiz(Arvore): retorna o nó raiz da árvore
que foi criado em Arvore
3. Vazia(Arvore): Função que retorna TRUE se a
árvore está vazia e FALSE do contrário;
4. InserirFilhoDireita(Arvore,pai,item): Insere o
elemento item na árvore à direita do nó pai se ele
não possui um filho à direita;
5. InserirFilhoEsquerda(Arvore,pai,item): Insere o
elemento item na árvore à esquerda do nó pai;
Operações Básicas da Árvore Binária
6. Busca(Arvore, item,pont): retorna o ponteiro
pont para o nó item em Arvore; se item não
existe retorna null
7. PercursoPosOrdem(Arvore): percorre em pós-
ordem;
8. PercursoPreOrdem(Arvore): percorre em pré-
ordem;
9. PercursoEmOrdem(Arvore): percorre nós em
ordem;
10. Esvaziar(Arvore): libera todo o espaço de
memória alocado pela árvore, tornando-a vazia
11. Remover(Arvore, item, flag): remover o nó item
de Arvore; flag = FALSE se nó não existe
Percorrendo Árvores Binárias

• Uma árvore é uma estrutura não seqüêncial,


diferentemente de uma lista, por exemplo. Não
existe ordem natural para percorrer árvores e
portanto podemos escolher diferentes maneiras
de percorrê-las. Nós iremos estudar três
métodos para percorrer árvores. Todos estes
três métodos podem ser definidos
recursivamente e se baseiam em três operações
básicas: visitar a raiz, percorrer a subárvore da
esquerda e percorrer a subárvore da direita. A
única diferença entre estes métodos é a ordem
em que estas operações são executadas.
Percursos em Árvores Binárias
• A busca nada mais é do que um percurso em
uma árvore;
• O percurso em uma árvore visitando cada nó
uma única vez gera uma seqüência linear de nós;
• Assim, passa a ter sentido falar em sucessor e
predecessor de um nó segundo um determinado
percurso;
• Há três maneiras recursivas de se percorrer
árvores binárias:
– Percurso em pré-ordem
– Percurso em pós-ordem
– Percurso em ordem
Percurso em Em Ordem
• Algoritmo básico: Em Ordem ou Simétrica
1. Se árvore vazia  fim
2. percorrer subárvore esquerda
3. visitar o nó raiz
4. percorrer subárvore direita

2 6
1 2 3 4 5 6 7 8 9

4 8 D B A E G C H F I
1

5 9
7
Percurso em Pré-Ordem
• Algoritmo básico:
1. Se árvore vazia  fim
2. visitar o nó raiz
3. percorrer subárvore esquerda em pré-ordem
4. percorrer subárvore direita em pré-ordem

2 4
1 2 3 4 5 6 7 8 9
A B D C E G F H I
5 7
3

8
6 9
Percurso em Pós-Ordem

• Algoritmo básico:
1. Se árvore vazia  fim
2. percorrer subárvore esquerda em pós-ordem
3. percorrer subárvore direita em pós-ordem
4. visitar o nó raiz

9
1 2 3 4 5 6 7 8 9
2 8 D B G E H I F C A

4
1 7

5
3 6