Академический Документы
Профессиональный Документы
Культура Документы
Mdulo 13 - rvores
7/6/2006
Referncias
Waldemar Celes, Renato Cerqueira, Jos Lucas Rangel, Introduo a Estruturas de Dados, Editora Campus (2004) Captulo 13 rvores
7/6/2006
Tpicos
Introduo rvores binrias
Representao em C Ordens de percurso em rvores binrias Altura de uma rvore
Introduo
rvore
um conjunto de ns tal que
existe um n r, denominado raiz, com zero ou mais sub-rvores, cujas razes esto ligadas a r os ns razes destas sub-rvores so os filhos de r os ns internos da rvore so os ns com filhos as folhas ou ns externos da rvore so os ns sem filhos
n raiz
...
sub-rvores
7/6/2006
rvores binrias
um rvore em que cada n tem zero, um ou dois filhos uma rvore binria :
uma rvore vazia; ou um n raiz com duas sub-rvores:
a sub-rvore da direita (sad) a sub-rvore da esquerda (sae)
vazia
raiz
sae
sad
7/6/2006
rvores binrias
Exemplo
rvores binrias representando expresses aritmticas:
ns folhas representam operandos ns internos operadores exemplo: (3+6)*(4-1)+5
* + 3 6 4 1 + 5
7/6/2006
rvores binrias
Notao textual:
a rvore vazia representada por <> rvores no vazias por <raiz sae sad> exemplo:
<a <b <> <d<><>> > <c <e<><>> <f<><>>> >
a b c
7/6/2006
Representao de um n da rvore:
estrutura em C contendo
a informao propriamente dita (exemplo: um caractere) dois ponteiros para as sub-rvores, esquerda e direita
struct arv { char info; struct arv* esq; struct arv* dir; };
7/6/2006 (c) Dept. Informtica - PUC-Rio 8
arv_criavazia (void); arv_cria (char c, Arv* e, Arv* d); arv_libera (Arv* a); arv_vazia (Arv* a); arv_pertence (Arv* a, char c); arv_imprime (Arv* a);
(c) Dept. Informtica - PUC-Rio 9
raiz
sae
sad
7/6/2006
10
7/6/2006
11
Arv* arv_cria (char c, Arv* sae, Arv* sad) { Arv* p=(Arv*)malloc(sizeof(Arv)); p->info = c; p->esq = sae; p->dir = sad; return p; }
7/6/2006 (c) Dept. Informtica - PUC-Rio 12
7/6/2006
13
retorna uma rvore vazia, representada por NULL Arv* arv_libera (Arv* a){ if (!arv_vazia(a)){ arv_libera(a->esq); arv_libera(a->dir); free(a); } return NULL; }
7/6/2006
14
7/6/2006
15
int arv_pertence (Arv* a, char c){ if (arv_vazia(a)) return 0; /* rvore vazia: no encontrou */ else return a->info==c || arv_pertence(a->esq,c) || arv_pertence(a->dir,c); }
7/6/2006 (c) Dept. Informtica - PUC-Rio 16
void arv_imprime (Arv* a) { if (!arv_vazia(a)){ printf("%c ",a->info); /* mostra raiz */ arv_imprime(a->esq); /* mostra sae */ arv_imprime(a->dir); /* mostra sad */ } }
7/6/2006 (c) Dept. Informtica - PUC-Rio 17
a b c
7/6/2006
18
7/6/2006
19
7/6/2006
20
10
7/6/2006
21
ordem simtrica:
percorre sae, trata raiz, percorre sad exemplo: b d a e c f
ps-ordem:
percorre sae, percorre sad, trata raiz exemplo: d b e f c a
7/6/2006 (c) Dept. Informtica - PUC-Rio 22
11
exemplo:
h=2
b d
7/6/2006
a c e f
23
7/6/2006
24
12
2 h+1 1
nvel 0: 20 = 1 n nvel 1: 21 = 2 ns nvel 2: 22 = 4 ns nvel 3: 23 = 8 ns
7/6/2006
25
7/6/2006
26
13
7/6/2006
27
7/6/2006
28
14
7/6/2006
29
rvores com at 3 ns
struct arv3 { char info; struct arv3 *f1,*f2,*f3; } a info f1 f2 f3
b 0 e 0 0 0
7/6/2006
0 f 0
c 0 0 g
d 0 0
0
(c) Dept. Informtica - PUC-Rio 30
15
7/6/2006
31
struct arvvar { char info; struct arvvar *prim; struct arvvar *prox; };
16
7/6/2006
33
7/6/2006
34
17
7/6/2006
35
7/6/2006
36
18
7/6/2006
37
7/6/2006
38
19
39
40
20
7/6/2006
41
21
rvores varivel:
ponteiros para a primeira sub-rvore filha e para a sub-rvore irm
7/6/2006
43
7/6/2006
44
22
Resumo
rvore binria
uma rvore vazia; ou um n raiz com duas sub-rvores:
a sub-rvore da direita (sad) a sub-rvore da esquerda (sae)
vazia
raiz
sae
sad
7/6/2006
45
23