Escolar Documentos
Profissional Documentos
Cultura Documentos
17/05/2011
Fontes Bibliogrficas
Livros:
Introduo a Estruturas de Dados (Celes, Cerqueira e Rangel): Captulo 13; Projeto de Algoritmos (Nivio Ziviani): Captulo 5; Estruturas de Dados e seus Algoritmos (Szwarefiter, et. al): Captulo 3; Algorithms in C (Sedgewick): Captulo 5;
Introduo
Estruturas estudadas at agora no so adequadas para representar dados que devem ser dispostos de maneira hierrquica
Ex., hierarquia de pastas rvore genealgica
Formas de representao
Representao por parnteses aninhados
( A (B) ( C (D (G) (H)) (E) (F (I))))
Diagrama de Incluso
Representao Hierrquica
Subrvore
As subrvores Tb, Te, Tg, Th, Ti possuem apenas o n raiz e nenhuma subrvore.
Conceitos Bsicos
Ns filhos, pais, tios, irmos e av Grau de sada (nmero de filhos de um n) N folha (grau de sada nulo) e n interior (grau de sada diferente de nulo) Grau de uma rvore (mximo grau de sada) Floresta (conjunto de zero ou mais rvores)
Comprimento do Caminho
Um caminho de vk vrtices obtido pela sequncia de k-1 pares. O valor k-1 o comprimento do caminho.
Nvel ou profundidade de um n
nmero de ns do caminho da raiz at o n.
Armazenamento por nvel: posio do n 1 2 3 i posio dos filhos do n 2,3 4,5 6,7 (2i,2i+1)
Exemplo
rvore binria representando expresses aritmticas binrias
Ns folhas representam os operandos Ns internos representam os operadores (3+6)*(4-1)+5
rvores Binrias
Notao textual
a rvore vazia representada por <> rvores no vazias por <raiz sae sad>
Exemplo:
<a <b <> <d<><>> > <c <e<><>> <f<><>>> >
rvore Binria
Uma 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 subrvore da direita (sad) a subrvore da esquerda (sae)
struct arv { char info; struct arv* esq; struct arv* dir; };
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; }
arv_criavazia e arv_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);
Arv* arv_libera (Arv* a){ if (!arv_vazia(a)){ arv_libera(a->esq); /* libera sae */ arv_libera(a->dir); /* libera sad */ free(a); /* libera raiz */ } return NULL; }
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); }
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 */ } }
Exemplo
Criar a rvore <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' */ a Arv* a5= arv_cria('c',a3,a4); /* rvore 'a' */ b c Arv* a = arv_cria('a',a2,a5 );
d e f
Exemplo
Criar a rvore <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 d e c f
Exemplo
Acrescenta ns x, y e z 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
Exemplo
Libera ns a->dir->esq = arv_libera(a->dir->esq);
a b x y z d e c f
Ps-ordem:
percorre sae, percorre sad, trata raiz exemplo: d b e f c a
Pre-ordem
+*+36-415
In-ordem
3+6*4-1+5
Ps-ordem
36+41-*5+
Pergunta
funo arv_pertence
Pr-ordem, ps-ordem ou in-ordem?
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); }
Pergunta
funo arv_libera
Pr-ordem, ps-ordem ou in-ordem?
Arv* arv_libera (Arv* a){ if (!arv_vazia(a)){ arv_libera(a->esq); /* libera sae */ arv_libera(a->dir); /* libera sad */ free(a); /* libera raiz */ } return NULL; }
Esforo computacional necessrio para alcanar qualquer n da rvore proporcional altura da rvore Exemplo: a
h=2
b c
nvel 0
nvel 1
nvel 2
Exerccios
Escrever uma funo recursiva que calcule a altura de uma rvore binria dada. A altura de uma rvore igual ao mximo nvel de seus ns.
Respostas
static int max2 (int a, int b) { return (a > b) ? a : b; }
int arv_altura (Arv* a) { if (arv_vazia(a)) return -1; else return 1 + max2 (arv_altura (a->esq), arv_altura (a->dir)); }
Exerccios
Escrever o algoritmo de visita em Pr-Ordem utilizando alocao dinmica mas sem utilizar procedimentos recursivos. Utilizar pilha (definindo um vetor que pode ser acessado pelo topo) para saber o endereo da subrvore que resta direita.
processar raiz A guardar A na pilha para poder acessar C depois passa B e processa essa subrvore idem para D retorna B (topo da pilha) para acessar D que a subrvore esquerda
Respostas
void arv_preordem (Arv* a) { Arv* A[MAX]; //qual seria o valor de max? Arv* p; Arv* raiz; int topo; int acabou; topo = 0; p = a; acabou = arv_vazia(a); //inicializaes while (!acabou) // enquanto houver ns para processar { while (!arv_vazia(p)) { processa (p->info); topo++; A[topo] = p; p = p->esq; } if (topo != 0) { p = A[topo]->dir; topo--; } else {acabou = 1;} } }
Para casa
Fazer funo para retornar o pai de um dado n de uma rvore
Dado um item, procura se item existe na rvore (usando algum algoritmo de travessia) Caso positivo retorna o contedo do pai do n Pode ser recursivo ou no