estruturas de dados aula 15: Árvores 09/06/2014. fontes bibliográficas livros: –introdução a...
TRANSCRIPT
![Page 1: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/1.jpg)
Estruturas de DadosAula 15: Árvores
09/06/2014
![Page 2: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/2.jpg)
Fontes Bibliográficas
• Livros:– Introdução a Estruturas de Dados (Celes,
Cerqueira e Rangel): Capítulo 13;– Projeto de Algoritmos (Nivio Ziviani): Capítulo 5;– Estruturas de Dados e seus Algoritmos
(Szwarefiter, et. al): Capítulo 3;– Algorithms in C (Sedgewick): Capítulo 5;
• Slides baseados no material da PUC-Rio, disponível em http://www.inf.puc-rio.br/~inf1620/.
![Page 3: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/3.jpg)
Introdução
• Estruturas estudadas até agora não são adequadas para representar dados que devem ser dispostos de maneira hierárquica– Ex., hierarquia de pastas– Árvore genealógica
• Árvores são estruturas adequadas para representação de hierarquias
![Page 4: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/4.jpg)
Definição Recursiva de Árvore
• Um conjunto de nós tal que:– existe um nó r, denominado raiz, com zero ou mais sub-
árvores, cujas raízes estão ligadas a r– os nós raízes destas sub-árvores são os filhos de r– os nós internos da árvore são os nós com filhos– as folhas ou nós externos da árvore são os nós sem filhos
![Page 5: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/5.jpg)
Formas de representação• Representação por parênteses aninhados
– ( A (B) ( C (D (G) (H)) (E) (F (I))))
Diagrama de Inclusão Representação Hierárquica
![Page 6: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/6.jpg)
Subárvore
• Seja a árvore acima T = {A, B, ...}• A árvore T possui duas subárvores:
– Tb e Tc onde Tb = { B } e Tc = {C, D, ...}
• A subárvore Tc possui 3 subárvores: – Td, Tf e Te onde Td = {D, G, H}, Tf = {F,
I}, Te = {E} • As subárvores Tb, Te, Tg, Th, Ti possuem
apenas o nó raiz e nenhuma subárvore.
![Page 7: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/7.jpg)
Exemplo (árvore de expressão)
• Representação da expressão aritmética: (a + (b * (c / d - e)))
![Page 8: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/8.jpg)
Conceitos Básicos
• Nós filhos, pais, tios, irmãos e avô • Grau de saída (número de filhos de um nó) • Nó folha (grau de saída nulo) e nó interior (grau de saída
diferente de nulo)• Grau de uma árvore (máximo grau de saída)• Floresta (conjunto de zero ou mais árvores)
![Page 9: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/9.jpg)
Conceitos Básicos (2)
• Caminho – Uma sequência de nós distintos v1, v2, ..., vk, tal que
existe sempre entre nós consecutivos (isto é, entre v1 e v2, entre v2 e v3, ... , v(k-1) e vk) a relação "é filho de“ ou "é pai de" é denominada um caminho na árvore.
• Comprimento do Caminho– Um caminho de vk vértices é obtido pela sequência de k-1
pares. O valor k-1 é o comprimento do caminho.
• Nível ou profundidade de um nó– número de nós do caminho da raiz até o nó.
![Page 10: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/10.jpg)
Conceitos Básicos (3)
• Nível da raiz (profundidade) é 0. • Árvore Ordenada: é aquela na qual filhos de cada nó
estão ordenados. Assume-se ordenação da esquerda para a direita. Esta árvore é ordenada?
![Page 11: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/11.jpg)
Conceitos Básicos (4)
• Árvore Cheia: Uma árvore de grau d é uma árvore cheia se possui o número máximo de nós, isto é, todos os nós têm número máximo de filhos exceto as folhas, e todas as folhas estão na mesma altura.
• Árvore cheia de grau 2: implementação sequencial.
Armazenamento por nível:
posição do nó posição dos filhos do nó 1 2,3 2 4,5 3 6,7 i (2i,2i+1)
![Page 12: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/12.jpg)
Exemplo
• Árvore binária representando expressões aritméticas de operadores binários (existe um '-' unário também, significado: Mudar sinal)– Nós folhas representam os operandos– Nós internos representam os operadores– (3+6)*(4-1)+5
![Page 13: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/13.jpg)
Árvores Binárias
• Notação textual– a árvore vazia é representada por <>– árvores não vazias por <raiz sae sad>
• Exemplo:– <a <b <> <d<><>> > <c <e<><>> <f<><>>> >
![Page 14: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/14.jpg)
Árvore Binária
• Uma árvore em que cada nó tem zero, um ou dois filhos• Uma árvore binária é:
– uma árvore vazia; ou– um nó raiz com duas sub-árvores:
• a subárvore da direita (sad)• a subárvore da esquerda (sae)
![Page 15: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/15.jpg)
Árvores Binárias – Implementação em C
• Representação: ponteiro para o nó raiz• Representação de um nó na árvore:
– Estrutura em C contendo• A informação propriamente dita (exemplo: um caractere, ou
inteiro)• Dois ponteiros para as sub-árvores, à esquerda e à direita
struct arv {
char info;
struct arv* esq;
struct arv* dir;
};
![Page 16: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/16.jpg)
TAD Árvores Binárias – Impl. em C (arv.h)typedef struct arv Arv;//Cria uma árvore vaziaArv* arv_criavazia (void);//cria uma árvore com a informação do nó raiz c, e//com subárvore esquerda e e subárvore direita dArv* arv_cria (char c, Arv* e, Arv* d);//libera o espaço de memória ocupado pela árvore aArv* arv_libera (Arv* a);//retorna true se a árvore estiver vazia e false //caso contrárioint arv_vazia (Arv* a);//indica a ocorrência (1) ou não (0) do caracter cint arv_pertence (Arv* a, char c);//imprime as informações dos nós da árvorevoid arv_imprime (Arv* a);
![Page 17: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/17.jpg)
TAD Árvores Binárias – Implementação em C
• Implementação das funções:– implementação em geral recursiva– usa a definição recursiva da estrutura
• Uma árvore binária é:– uma árvore vazia; ou– um nó raiz com duas sub-árvores:
• a sub-árvore da direita (sad)• a sub-árvore da esquerda (sae)
![Page 18: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/18.jpg)
TAD Árvores Binárias – Implementação em C
• função arv_criavazia– cria uma árvore vazia
Arv* arv_criavazia (void){
return NULL;
}
![Page 19: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/19.jpg)
TAD Árvores Binárias – Implementação em C
• função arv_cria– cria um nó raiz dadas a informação e as duas sub-árvores, a
da esquerda e a da direita– retorna o endereço 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;
}
![Page 20: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/20.jpg)
TAD Árvores Binárias – Implementação em C
• arv_criavazia e arv_cria– as duas funções para a criação de árvores
representam os dois casos da definição recursiva de árvore binária:
• uma árvore binária Arv* a;– é vazia a=arv_criavazia()– é composta por uma raiz e duas sub-árvores
a=arv_cria(c,sae,sad);
![Page 21: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/21.jpg)
TAD Árvores Binárias – Implementação em C
• função arv_vazia– indica se uma árvore é ou não vazia
int arv_vazia (Arv* a){
return a==NULL;
}
![Page 22: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/22.jpg)
TAD Árvores Binárias – Implementação em C
• função arv_libera– libera memória 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); /* libera sae */
arv_libera (a->dir); /* libera sad */
free(a); /* libera raiz */
}
return NULL;
}
![Page 23: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/23.jpg)
TAD Árvores Binárias – Implementação em C
• função arv_pertence– verifica a ocorrência de um caractere c em um dos nós– retorna um valor booleano (TRUE ou FALSE) indicando a
ocorrência ou não do caractere na árvore
boolean arv_pertence (Arv* a, char c){
if (arv_vazia(a))
return FALSE; /* árvore vazia: não encontrou */
boolean p = a->info==c;
if( p ) return p;
p = arv_pertence (a->esq,c);
if( p ) return p; return arv_pertence (a->dir,c);
}
![Page 24: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/24.jpg)
TAD Árvores Binárias – Implementação em C
• função arv_imprime– percorre recursivamente a árvore, visitando todos os nós e
imprimindo sua informação
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 */
}
}
![Page 25: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/25.jpg)
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' */
Arv* a5= arv_cria('c',a3,a4);
/* árvore 'a' */
Arv* a = arv_cria('a',a2,a5 );
d
b
e f
c
a
![Page 26: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/26.jpg)
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())
)
);
d
b
e f
c
a
![Page 27: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/27.jpg)
Exemplo
• Acrescenta nós x, y e z
a->esq->esq =
arv_cria(’x’,
arv_cria(’y’,
arv_criavazia(),
arv_criavazia()),
arv_cria(’z’,
arv_criavazia(),
arv_criavazia())
);d
b
e f
c
a
y z
x
![Page 28: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/28.jpg)
Exemplo
• Libera nós
a->dir->esq = arv_libera(a->dir->esq);
d
b
e f
c
a
y z
x
![Page 29: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/29.jpg)
Ordem de Percurso (ou travessia) – Árvores Binárias
• Pré-ordem:– trata raiz, percorre sae, percorre sad– exemplo: a b d c e f
• Ordem simétrica (ou In-Ordem):– percorre sae, trata raiz, percorre sad– exemplo: b d a e c f
• Pós-ordem:– percorre sae, percorre sad, trata raiz– exemplo: d b e f c a
d
b
e f
c
a
![Page 30: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/30.jpg)
Ordem de Percurso - Exercícios
• Fazer percurso de Pré-ordem• In-ordem• Pós-ordem
• Pre-ordem+*+36-415
• In-ordem3+6*4-1+5
• Pós-ordem36+41-*5+
![Page 31: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/31.jpg)
Pré-Ordem – Implementação recursiva
void arv_preordem (Arv* a){ if (!arv_vazia(a)) {
processa(a); // por exemplo imprime arv_preordem(a->esq); arv_preordem(a->dir);
}}
![Page 32: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/32.jpg)
In-Ordem – Implementação recursiva
void arv_inordem (Arv* a){ if (!arv_vazia(a)) {
arv_inordem (a->esq); processa (a); // por exemplo imprime
arv_inordem (a->dir); }}
![Page 33: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/33.jpg)
Pós-Ordem – Implementação recursiva
void arv_posordem (Arv* a){ if (!arv_vazia(a)) {
arv_posordem (a->esq); arv_posordem (a->dir); processa (a); // por exemplo imprime
}}
![Page 34: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/34.jpg)
Pergunta
• função arv_pertence– Pré-ordem, pós-ordem ou in-ordem?
boolean arv_pertence (Arv* a, char c){
if (arv_vazia(a))
return FALSE; /* árvore vazia: não encontrou */
boolean p = a->info==c;
if( p ) return p;
p = arv_pertence (a->esq,c);
if( p ) return p; return arv_pertence (a->dir,c);
}
![Page 35: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/35.jpg)
Pergunta
• função arv_libera– Pré-ordem, pós-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;
}
![Page 36: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/36.jpg)
Árvores Binárias - Altura
• Propriedade das árvores– Existe apenas 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
• Esforço computacional necessário para alcançar qualquer nó da árvore é proporcional à altura da árvore
• Exemplo:h = 2
d
b
e f
c
a
![Page 37: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/37.jpg)
nível 0
nível 1
nível 2
Árvores Binárias - conceitos
• Nível de um nó– a raiz está no nível 0, seus filhos diretos no nível 1, ...– o último nível da árvore é a altura da árvore
d
b
e f
c
a
![Page 38: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/38.jpg)
Árvores Binárias - conceitos
• Árvore Cheia– todos os seus nós internos têm duas sub-árvores
associadas– número n de nós de uma árvore cheia de altura h n = 2h+1 -1
![Page 39: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/39.jpg)
Árvores Binárias - conceitos
• Árvore Degenerada– Nós internos têm uma única subárvore associada– Vira uma estrutura linear– Arvore de altura h tem n = h+1
• Altura de uma árvore– Importante medida de eficiência (visitação do nó)– Árvore com n nós:
– Altura mínima proporcional a log2 n (árvore binária cheia)
– Altura máxima proporcional a n (árvore degenerada)
![Page 40: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/40.jpg)
Exercícios• Escrever uma função recursiva que calcule a altura
de uma árvore binária dada. A altura de uma árvore é igual ao máximo nível de seus nós.
![Page 41: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/41.jpg)
Respostasstatic int max2 (int a, int b){
return (a > b) ? a : b;} --- OU ----#define max2(a,b) {(a > b) ? a : b}
int arv_altura (Arv* a){
if (arv_vazia(a))return -1;
elsereturn 1 + max2 (arv_altura (a->esq),
arv_altura (a->dir)); }
![Page 42: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/42.jpg)
Exercícios• Escrever o algoritmo de visita em Pré-Ordem utilizando
alocação dinâmica mas sem utilizar procedimentos recursivos. Utilizar pilha (definindo um vetor que pode ser acessado pelo topo) para saber o endereço da subárvore que resta à direita.
– processar raiz A – guardar A na pilha para poder acessar C
depois – passa à B e processa essa subárvore – idem para D – retorna B (topo da pilha) para acessar D
que é a subárvore esquerda
![Page 43: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/43.jpg)
Respostasvoid arv_preordem (Arv* a){
Arv* A[MAX]; //qual seria o valor de max?Arv* p; Arv* raiz; int topo;boolean acabou;topo = 0; p = a; acabou = arv_vazia(a); //inicializaçõeswhile (!acabou) // enquanto houver nós 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 = TRUE;}
}
}
![Page 44: Estruturas de Dados Aula 15: Árvores 09/06/2014. Fontes Bibliográficas Livros: –Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo](https://reader035.vdocuments.mx/reader035/viewer/2022062700/552fc17d497959413d8f1206/html5/thumbnails/44.jpg)
Para casa• Fazer função 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 conteúdo do pai do nó – Pode ser recursivo ou não