Você está na página 1de 23

Estruturas de Dados

Mdulo 13 - rvores

7/6/2006

(c) Dept. Informtica - PUC-Rio

Referncias
Waldemar Celes, Renato Cerqueira, Jos Lucas Rangel, Introduo a Estruturas de Dados, Editora Campus (2004) Captulo 13 rvores

7/6/2006

(c) Dept. Informtica - PUC-Rio

Tpicos
Introduo rvores binrias
Representao em C Ordens de percurso em rvores binrias Altura de uma rvore

rvores com nmero varivel de filhos


Representao em C Tipo abstrato de dado Altura da rvore Topologia binria
7/6/2006 (c) Dept. Informtica - PUC-Rio 3

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

(c) Dept. Informtica - PUC-Rio

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

(c) Dept. Informtica - PUC-Rio

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

(c) Dept. Informtica - PUC-Rio

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

(c) Dept. Informtica - PUC-Rio

rvores binrias - Implementao em C


Representao de uma rvore:
atravs de um ponteiro para o n raiz

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

rvores binrias - Implementao em C


Interface do tipo abstrato rvore Binria: arv.h typedef struct arv Arv; Arv* Arv* Arv* int int void
7/6/2006

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

rvores binrias - Implementao em C


implementao recursiva, em geral usa a definio recursiva da estrutura
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

(c) Dept. Informtica - PUC-Rio

10

rvores binrias - Implementao em C


funo arv_criavazia
cria uma rvore vazia

Arv* arv_criavazia (void) { return NULL; }

7/6/2006

(c) Dept. Informtica - PUC-Rio

11

rvores binrias - Implementao em C


funo arv_cria
cria um n raiz dadas a informao e as duas sub-rvores, a da esquerda e a da direita retorna o endereo do n raiz criado

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

rvores binrias - Implementao em C


criavazia e cria
as duas funes para a criao de rvores representam os dois casos da definio recursiva de rvore binria:
uma rvore binria Arv* a;
vazia a=arv_criavazia() composta por uma raiz e duas sub-rvores a=arv_cria(c,sae,sad);

7/6/2006

(c) Dept. Informtica - PUC-Rio

13

rvores binrias - Implementao em C


funo arv_libera
libera memria alocada pela estrutura da rvore
as sub-rvores devem ser liberadas antes de se liberar o n raiz

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

/* libera sae */ /* libera sad */ /* libera raiz */

(c) Dept. Informtica - PUC-Rio

14

rvores binrias - Implementao em C


funo arv_vazia
indica se uma rvore ou no vazia

int arv_vazia (Arv* a) { return a==NULL; }

7/6/2006

(c) Dept. Informtica - PUC-Rio

15

rvores binrias - Implementao em C


funo arv_pertence
verifica a ocorrncia de um caractere c em um de ns retorna um valor booleano (1 ou 0) indicando a ocorrncia ou no do caractere na rvore

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

rvores binrias - Implementao em C


funo arv_imprime
percorre recursivamente a rvore, visitando todos os ns e imprimindo sua informao

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

rvores binrias - Implementao em C


Exemplo: <a <b <> <d <><>> > <c <e <><> > <f <><> > > >
/* sub-rvore 'd' */ Arv* a1= arv_cria('d',arv_criavazia(),arv_criavazia()); /* sub-rvore 'b' */ Arv* a2= arv_cria('b',arv_criavazia(),a1); /* sub-rvore 'e' */ Arv* a3= arv_cria('e',arv_criavazia(),arv_criavazia()); /* sub-rvore 'f' */ Arv* a4= arv_cria('f',arv_criavazia(),arv_criavazia()); /* sub-rvore 'c' */ Arv* a5= arv_cria('c',a3,a4); /* rvore 'a' */ Arv* a = arv_cria('a',a2,a5 );

a b c

7/6/2006

(c) Dept. Informtica - PUC-Rio

18

rvores binrias - Implementao em C


Exemplo: <a <b <> <d <><>> > <c <e <><> > <f <><> > > >
Arv* a = arv_cria('a', arv_cria('b', arv_criavazia(), arv_cria('d', arv_criavazia(), arv_criavazia()) ), arv_cria('c', arv_cria('e', arv_criavazia(), arv_criavazia()), arv_cria('f', arv_criavazia(), arv_criavazia()) ) );
a b c

7/6/2006

(c) Dept. Informtica - PUC-Rio

19

rvores binrias - Implementao em C


Exemplo - acrescenta ns
a->esq->esq = arv_cria('x', arv_cria('y', arv_criavazia(), arv_criavazia()), arv_cria('z', arv_criavazia(), arv_criavazia()) ); y a b x z d e c f

7/6/2006

(c) Dept. Informtica - PUC-Rio

20

10

rvores binrias - Implementao em C


Exemplo - libera ns
a->dir->esq = libera(a->dir->esq); b x y z d e a c f

7/6/2006

(c) Dept. Informtica - PUC-Rio

21

rvores binrias - Ordens de percurso


Ordens de percurso:
pr-ordem:
trata raiz, percorre sae, percorre sad exemplo: a b d c e f
a b c

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

rvores binrias - Altura


Propriedade fundamental de rvores
s existe um caminho da raiz para qualquer n

Altura de uma rvore


comprimento do caminho mais longo da raiz at uma das folhas
a altura de uma rvore com um nico n raiz zero a altura de uma rvore vazia -1

exemplo:
h=2
b d
7/6/2006

a c e f
23

(c) Dept. Informtica - PUC-Rio

rvores binrias - Altura


Nvel de um n
a raiz est no nvel 0, seus filhos diretos no nvel 1, ... o ltimo nvel da rvore a altura da rvore
a b d e c f nvel 0 nvel 1 nvel 2

7/6/2006

(c) Dept. Informtica - PUC-Rio

24

12

rvores binrias - Altura


rvore cheia
todos os seus ns internos tm duas sub-rvores associadas nmero n de ns de uma rvore cheia de altura h n=

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

(c) Dept. Informtica - PUC-Rio

25

rvores binrias - Altura


rvore degenerada
todos os seus ns internos tm uma nica sub-rvore associada nmero n de ns de uma rvore degenerada de altura h n = h+1

7/6/2006

(c) Dept. Informtica - PUC-Rio

26

13

rvores binrias - Altura


Esforo computacional necessrio para alcanar qualquer n da rvore
proporcional altura da rvore altura de uma rvore binria com n ns
mnima: mxima: proporcional a log n (caso da rvore cheia) proporcional a n (caso da rvore degenerada)

7/6/2006

(c) Dept. Informtica - PUC-Rio

27

rvores com nmero varivel de filhos


rvore com nmero varivel de filhos:
cada n pode ter mais do que duas sub-rvores associadas sub-rvores de um n dispostas em ordem
primeira sub-rvore (sa1), segunda sub-rvore (sa2), etc.

7/6/2006

(c) Dept. Informtica - PUC-Rio

28

14

rvores com nmero varivel de filhos


Notao textual: <raiz sa1 sa2 ... san>
exemplo: = <a <b <c <d> > <e> > <f> <g <h> <i <j> > > >

7/6/2006

(c) Dept. Informtica - PUC-Rio

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

rvores com nmero varivel de filhos Representao em C


Representao de rvore com nmero varivel de filhos:
utiliza uma lista de filhos:
um n aponta apenas para seu primeiro (prim) filho
c b a

cada um de seus filhos aponta para o prximo (prox) irmo

7/6/2006

(c) Dept. Informtica - PUC-Rio

31

rvores com nmero varivel de filhos Representao em C


Representao de um n da rvore:
estrutura em C contendo
a informao propriamente dita (exemplo: um caractere) ponteiro para a primeira sub-rvore filha
NULL se o n for uma folha

ponteiro para a prxima sub-rvore irmo


NULL se for o ltimo filho

struct arvvar { char info; struct arvvar *prim; struct arvvar *prox; };

/* ponteiro para eventual primeiro filho */ /* ponteiro para eventual irmo */

typedef struct arvvar ArvVar;


7/6/2006 (c) Dept. Informtica - PUC-Rio 32

16

rvores com nmero varivel de filhos Representao em C


Interface do tipo abstrato rvore Varivel: arvvar.h typedef struct arvvar ArvVar; ArvVar* void void int void arvv_cria (char c); arvv_insere (ArvVar* a, ArvVar* sa); arvv_imprime (ArvVar* a); arvv_pertence (ArvVar* a, char c); arvv_libera (ArvVar* a);

7/6/2006

(c) Dept. Informtica - PUC-Rio

33

rvores com nmero varivel de filhos Representao em C


Implementao das funes:
implementao recursiva, em geral usa a definio recursiva da estrutura Uma rvore composta por:
um n raiz zero ou mais sub-rvores

7/6/2006

(c) Dept. Informtica - PUC-Rio

34

17

rvores com nmero varivel de filhos Representao em C


Implementao das funes (cont.):
uma rvore no pode ser vazia uma folha identificada como um n com zero sub-rvores
uma folha no um n com sub-rvores vazias, como nas rvores binrias

funes no consideram o caso de rvores vazias

7/6/2006

(c) Dept. Informtica - PUC-Rio

35

rvores com nmero varivel de filhos Representao em C


funo arvv_cria
cria uma folha
aloca o n inicializa os campos, atribuindo NULL aos campos prim e prox ArvVar* arvv_cria (char c) { ArvVar *a =(ArvVar *) malloc(sizeof(ArvVar)); a->info = c; a->prim = NULL; a->prox = NULL; return a; }

7/6/2006

(c) Dept. Informtica - PUC-Rio

36

18

rvores com nmero varivel de filhos Representao em C


funo arvv_insere
insere uma nova sub-rvore como filha de um dado, sempre no incio da lista, por simplicidade
void arvv_insere (ArvVar* a, ArvVar* sa) { sa->prox = a->prim; b a->prim = sa; }
c e a

7/6/2006

(c) Dept. Informtica - PUC-Rio

37

rvores com nmero varivel de filhos Representao em C


funo arvv_imprime
imprime o contedo dos ns em pr-ordem
void arvv_imprime (ArvVar* a) { ArvVar* p; printf("<%c\n",a->info); for (p=a->prim; p!=NULL; p=p->prox) arvv_imprime(p); /* imp.filhas */ printf(">"); }
c

7/6/2006

(c) Dept. Informtica - PUC-Rio

38

19

rvores com nmero varivel de filhos Representao em C


funo arvv_pertence
verifica a ocorrncia de uma dada informao na rvore
int arvv_pertence (ArvVar* a, char c) { ArvVar* p; if (a->info==c) return 1; else { for (p=a->prim; p!=NULL; p=p->prox) { if (arvv_pertence(p,c)) return 1; } return 0; } }
7/6/2006 (c) Dept. Informtica - PUC-Rio
a

39

rvores com nmero varivel de filhos Representao em C


funo arvv_libera
libera a memria alocada pela rvore
libera as sub-rvores antes de liberar o espao associado a um n (libera em ps-ordem) void arvv_libera (ArvVar* a) { ArvVar* p = a->prim; while (p!=NULL) { ArvVar* t = p->prox; arvv_libera(p); p = t; } free(a); }
7/6/2006 (c) Dept. Informtica - PUC-Rio
a

40

20

rvores com nmero varivel de filhos - Altura


nvel e altura
(definidos de forma semelhante a rvores binrias) exemplo:
h=3

7/6/2006

(c) Dept. Informtica - PUC-Rio

41

rvores com nmero varivel de filhos


funo para calcular altura:
a altura da rvore ser o maior valor entre
a altura da sub-rvore filha acrescido de uma unidade e a altura da sub-rvore irm static int max2 (int a, int b) { return (a > b) ? a : b; } int arvv_altura (ArvVar* a) { if (a==NULL) return -1; else return max2(1+arvv_altura(a->prim),arvv_altura(a->prox)); }
7/6/2006 (c) Dept. Informtica - PUC-Rio 42

21

rvores com nmero varivel de filhos Topologia Binria


Topologia binria:
representao de um n de uma rvore varivel representao de um n da rvore binria n possui informao e dois ponteiros para sub-rvores
rvore binria:
ponteiros para as sub-rvores esquerda e direita

rvores varivel:
ponteiros para a primeira sub-rvore filha e para a sub-rvore irm

7/6/2006

(c) Dept. Informtica - PUC-Rio

43

rvores com nmero varivel de filhos Topologia Binria


Topologia binria:
redefinio de rvore com nmero varivel de filhos:
rvore vazia, ou um n raiz tendo duas sub-rvores, identificadas como a sub-rvore filha e a sub-rvore irm

re-implementao das funes:


pode se basear na nova definio o caso da rvore vazia agora deve ser considerado

7/6/2006

(c) Dept. Informtica - PUC-Rio

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

rvore com nmero varivel de filhos


um n raiz zero ou mais sub-rvores

7/6/2006

(c) Dept. Informtica - PUC-Rio

45

23

Você também pode gostar