Professional Documents
Culture Documents
rvores
1. Introduo
2. Definies Bsicas
3. rvores Binrias
4. Armazenamento de rvores Binrias
5. Uma Aplicao de rvores Binrias
6. Percorrendo rvores Binrias
7. O Algoritmo de Huffman
8. Removendo Ns de rvores Binrias
9. rvores Binrias Balanceadas
10. Exerccios
Introduo
Definies Bsicas
nvel 0 = A
nvel 1 = B, C
nvel 2 = D, E, F, G
nvel 3 = H, I
(A (B(D))(C(E(H)(I))(F)(G)))
Esta representao tem importncia, por exemplo, no tratamento de
expresses aritmticas, j que toda expresso aritmtica pode ser colocada
nesta forma. Se colocarmos uma expresso nesta forma podemos ento
represent-la como uma rvore, mostrando como ela seria calculada. Para
colocarmos uma expresso em forma de rvore devemos considerar cada
operador como um n da rvore e os seus operandos como as duas
subrvores. Considere a expresso C seguinte
A + (B-C)*D%(E*F)
(A + ((B-C)*(D%(E*F))))
A figura arvexp mostra como fica esta expresso representada por uma
rvore.
rvores Binrias
A figura arvbin abaixo mostra um importante tipo de rvore que a rvore
binria. Em uma rvore binria cada n tem no mximo duas subrvores, e
quando h somente uma presente necessrio distinguir entre subrvore
esquerda e direita. rvores binrias podem ser vistas em diversas
situaes do cotidiano. Por exemplo, um torneio de futebol eliminatrio,
do tipo das copas dos pases, como a Copa do Brasil, em que a cada etapa
os times so agrupados dois a dois e sempre so eliminados metade dos
times uma rvore binria.
Figura abin: rvore binria
Uma rvore estritamente binria uma rvore binria em que cada n tem
0 ou 2 filhos. Uma rvore binria cheia uma rvore em que se um n tem
alguma sub-rvore vazia ento ele est no ltimo nvel. Uma rvore
completa aquela em se n um n com algumas de subrvores vazias,
ento n se localiza no penltimo ou no ltimo nvel. Portanto, toda rvore
cheia completa e estritamente binria. A Figura arvbcc mostra uma
rvore estritamente binria, completa e cheia.
p = cria_no();
p->info = x;
p->esq = NULL;
p->dir = NULL;
return p;
/* programa arv0300.c */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main() {
tNo *raiz, *p, *q;
char linha[80], *numero;
int num;
gets(linha);
numero = strtok(linha, " "); /* pega o primeiro numero da
lista */
num = atoi(numero);
raiz = cria_arvore(num); /* insere na raiz */
numero = strtok(NULL, " ");
while (numero) {
q = raiz; p = raiz;
printf("Li numero %d\n", num); /* le novo numero */
num = atoi(numero);
while (num != p->info && q) { /* procura na arvore */
p = q;
if (num < p->info)
q = p->esq; /* passa para arvore esquerda */
else
q = p->dir; /* passa para direita */
}
if (num == p->info)
printf("O numero %d ja existe na arvore.\n", num);
else { /* vou inserir o numero na arvore */
if (num < p->info)
pos_esq(p, num);
else
pos_dir(p, num);
}
numero = strtok(NULL, " ");
} /* fim do while (numero) */
}
tNo *cria_arvore (int x) {
tNo *p;
p = cria_no ();
if (p) {
p->info = x;
return p;
}
else {
puts("Faltou espaco para alocar no.");
exit(1);
}
}
tNo *cria_no() {
tNo *p;
if (p->esq)
puts("Operacao de insercao a esquerda ilegal.");
else {
q = cria_arvore(x);
p->esq = q;
}
}
1. Visitar a raiz;
2. Percorrer a subrvore da esquerda em pr-ordem;
3. Percorre a subrvore da direita em pr-ordem.
Para a rvore da Figura arvbinp este percurso forneceria, no caso da visita
significar imprimir, os seguintes resultados: F B A D C E H G I. Uma
aplicao interessante deste tipo de percurso aplic-lo uma rvore que
contenha uma expresso aritmtica, a qual foi expandida e recebeu todos
os parnteses. Por exemplo, aplicando-se o percurso em pr-ordem
rvore arvexp obtm-se como resultado a expresso em notao polonesa
normal, isto os operandos antes dos operadores. Deste modo o resultado
+A*-BC%D*EF. Observar que esta notao diferente da notao
polonesa reversa, em que os operadores aparecem depois dos operandos.
Um algoritmo recursivo para implementar este modo de percurso pode ser
o seguinte:
void pre_ordem ( tipoNo *pt) {
if (pt) {
visita (pt);
pre_ordem (pt->esq);
pre_ordem (pt->dir);
}
}
2 3 4 5 7 8 10
Algoritmo de Huffman
Para analisarmos mais uma aplicao de rvores binrias vamos considerar
o problema de codificar uma mensagem composta de uma seqncia de
smbolos de um alfabeto de n smbolos. Esta mensagem ser transformada
em uma seqncia de bits, depois de a cada smbolo for atribudo um
cdigo binrio e os cdigos dos smbolos da mensagem forem
concatenados.
Considere um alfabeto composto de quatro smbolos A, B, C e D, sendo
que a cada um dos smbolos foi atribudo o cdigo indicado a seguir:
Smbolo Cdigo
A 0
B 1
C 10
D 11
A mensagem ABCADCA seria codificada da seguinte maneira
00011000111000, tendo comprimento de 14 bits. O objetivo do algoritmo
criar um cdigo que minimize o comprimento da mensagem. Para criar
este cdigo vamos levar em conta a freqncia de cada smbolo na
mensagem. A Tabela a seguir mostra a freqncia de cada smbolo na
mensagem
Smbolo Freqncia
A 3
B 1
C 2
D 1
Desta tabela podemos verificar que se atribuirmos ao smbolo A um cdigo
binrio mais curto que os atribudos aos smbolos B e D teramos uma
mensagem menor. Isto provm do fato que o smbolo A aparece mais vezes
do que os smbolos B e D. Suponha que os seguintes cdigos sejam
atribudos aos smbolos
Smbolo Cdigo
A 0
B 110
C 10
D 111
Usando estge cdigo a mensagem ABCADCA ficaria 0110100111100 que
requer 13 bits. Em mensagens longas com mais smbolos infrequentes o
ganho pode ser maior. Um dos requerimentos deste cdigo que nenhum
cdigo seja prefixo de outro, caso a decodificao seja feita da esquerda
para direita.
O texto abaixo mosta uma rotina que remove ns de uma rvore, que
contm nmeros inteiros. O programa completo est em arvremov.c.
p = tree; q=NULL;
/* procura o no com a chave num, p aponta para o no
e q aponta para o pai do no */
while ( p && p->info != num) {
q = p;
if ( num < p->info)
p = p->esq;
else
p = p->dir;
} /* fim do while */
if (!p) return NULL; /* a chave nao existe na arvore */
q = p->direita;
temp = q->esquerda;
q->esquerda = p;
p->direita = temp;
|hd(p) - he(p)| = 2
caso 1.1
Exerccios
1. Escreva um programa que crie uma rvore de busca binria a partir
de letras lidas do teclado. O programa deve imprimir a rvore nos
trs modos de percurso.
Soluo: arv0301.c