Árvores Binárias

50
 Prof. Carlos Caminha  [email protected] Árvores

Transcript of Árvores Binárias

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 1/50

Prof. Carlos Caminha – [email protected] 

• Árvores

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 2/50

 

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 3/50

3

Árvores Organização dos dados:Linear:

Listas, pilhas, filas.

Relação sequencial.Não-linear:

Outros tipos de relação entre dados; Hierarquia; Árvores Grafos.

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 4/50

4

Árvores

Estrutura não-linear que representa umarelação de hierarquiaExemplo:

Árvore de diretórios;Árvore genealógica.

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 5/50

5

Árvores

Exemplo:

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 6/50

6

Árvores

Aplicações de árvoresComposição da estrutura de um livro 

Estrutura de Dados

Capítulo 11.1 Listas1.2 Pilha1.3 FilaCapítulo 22.1 Recursividade

2.1.1 HanoiCapítulo 33.1 Árvores3.2 Árvores binárias

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 7/507

Árvores

Aplicações de árvoresOrganograma de uma empresa 

Presidência

Consultoria Diretoria A Diretoria B

Informática Jurídica

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 8/508

Árvores

Aplicações de árvoresRepresentação de expressõesaritméticas 

• (a + (b * ( (c / d) - e) ) )

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 9/509

Árvores

Formas de representação:Hierárquica:

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 10/5010

Árvores

Formas de representação:Diagrama de inclusão:

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 11/5011

Árvores

Formas de representação:Representação por parênteses aninhados:

( A (B) ( C (D (G) (H)) (E) (F (I)) ) )

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 12/50

12

Árvores

Caracterização de uma árvore:Composta por um conjunto de nósExiste um nó r, chamado nó raizEste nó contém zero ou mais sub-árvores, cujas raízes

são ligadas diretamente a rOs nós raízes das sub-árvores são ditos filhos do nópai r

 “Nós” que não têm filhos são chamados de folhas

É tradicional desenhar as árvores com araiz para cima e folhas para baixo

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 13/50

13

Árvores

CaracterísticasUm nó filho não pode ter dois pais.O filho não sabe quem é o pai.Este exemplo não é árvore! É um grafo.

Não éarvore!

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 14/50

14

Árvores

Representação gráfica de uma árvore

raiz

A B C D… 

Sub-árvores donó raiz

Filhos de CFilhos de A

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 15/50

15

Árvores

O número de sub-árvores de um nó determina o “grau de saída“ desse nó. Ou seja, a quantidade defilhos.Grau Máximo, ou grau da árvoreMaior grau de seus nós.

Nós que não tem grau (grau == 0), sãodenominados de nó folhaPara identificar os nós de uma estrutura, usamos arelação de hierarquia existente em uma árvore

genealógicaFilho, pai, neto, irmão

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 16/50

16

Árvores

NívelRepresenta a distância de um nó até a raizO nó de maior nível nos fornece a alturaSó existe um caminho da raiz para qualquer nó

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 17/50

17

Árvores

Nível

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 18/50

18

Árvores

Nível

nível 0

nível1

nível2

nível3

Altura da árvore que começa em A é 3

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 19/50

19

Árvores

Floresta Conjunto de uma ou mais árvores.

Caminho

Percusso realizado para atingir algum nóconsiderando sempre a relação de pai e filhoentre eles.

Comprimento do caminho

Quantidade de nós percorridos no caminho.

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 20/50

20

Árvores

Árvore Cheia Árvore com número máximo de nós.Uma árvore de grau d  tem número máximo de

nós se cada nó, com exceção das folhas, temgrau d .

Exemplo:

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 21/50

21

Árvores

ExercíciosPara a seguinte árvore:

a) Quais os nós folhas?b) Qual o grau de cada nó?c) Qual o grau da árvore?d) Liste os ancestrais dos nós B, G e I.e) Liste os descendentes do nó D.f) Dê o nível e altura do vértice F.g) Dê o nível e a altura do vértice A.h) Qual a altura da árvore ?

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 22/50

22

Árvores

O número de filhos permitido por nó eas informações armazenadas em cadanó diferenciam os diversos tipos deárvores existentes.Tipos de árvores:

Binárias; B;

AVL; Vermelho e Preta; outras...

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 23/50

23

Árvores Binárias

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 24/50

24

Árvores Binárias

DefiniçãoTipo de árvore em que seus nós possuem nomáximo duas sub-árvoresÁrvore de grau máximo igual a 2

As duas sub-árvores de cada nó sãodenominadas: sub-árvore esquerda sub-árvore direita

Árvore binária completaÁrvore em que cada nó possui dois filhos, excetoo nó folha.

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 25/50

25

Árvores Binárias

IlustraçãoA

B C

D E F

G

Nivel 1

Nivel 2

Nivel 3

Raízes das sub-árvores

Raiz

Esquerda Direita

Grau máximo: 02

Folhas

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 26/50

26

Árvores Binárias

Representação em CComo poderíamos definir a estrutura de dadospara representar uma árvore binária?

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 27/50

27

Árvores Binárias

Representação em CComo poderíamos definir a estrutura de dadospara representar uma árvore binária?

dado

Filho esquerdo Filho direitonó

typedef struct no {

struct no * esq;t_elemento dado;struct no * dir;

} t_no;

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 28/50

28

Árvores Binárias

Representação em C (cont.)A maioria das funções de manipulação de árvoressão implementadas de forma recursivaQue operações serão necessárias?Criação/Iniciliazação da árvoreCria nó raizÁrvore vazia

Imprimir a árvoreInserir filho esquerdoInserir filho direitoRemover um determinado nó

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 29/50

29

Árvores Binárias

ConsideraçõesUma árvore é representada pelo endereço do nóraizUma árvore vazia é representada pelo valor NULL

Algoritmos em CEstrutura da árvoreInicializaçãoCriação de nós

Criação de filhos esquerdo e direitoDeslocamento para o filho esquerdo ou direitoImpressão (exibição) da árvorePesquisa

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 30/50

30

Árvores Binárias

PercursoUm percurso define a ordem em que os nós deuma árvore serão processados

Tipos de percurso:Pré-ordemUtiliza o nóPercorre a sub-árvore esquerdaPercorre a sub-árvore direita

In-ordemPercorre a sub-árvore esquerdaUtiliza o nóPercorre a sub-árvore direita

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 31/50

31

Árvores Binárias

Tipos de percurso:Pós-ordemPercorre a sub-árvore esquerdaPercorre a sub-árvore direitaUtiliza o nó

 A 

B C

D E GF

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 32/50

32

Árvores Binárias

Tipos de percurso:

 A 

B C

D E GF

Pré-ordem:

In-ordemPós-ordem

ABDECFG

DBEAFCGDEBFGCA

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 33/50

33

Árvores Binárias

Implementação? –  Recursividade –  Assim como as filas recursivas

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 34/50

34

Árvores Binárias

Implementação em C – Pré-ordem:void exibirPreOrdem(t_arvore tree){

if (tree!=NULL) {

printf("%s ", tree->dado.nome);exibirPreOrdem(tree->esq);exibirPreOrdem(tree->dir);

}}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 35/50

35

Árvores Binárias

Implementação em C – In-ordemvoid exibirInOrdem(t_arvore tree){

if (tree!=NULL) {

exibirInOrdem(tree->esq);printf("%s ", tree->dado.nome);exibirInOrdem(tree->dir);

}}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 36/50

36

Árvores Binárias

Implementação em C – Pós-ordemvoid exibirPosOrdem(t_arvore tree){

if (tree!=NULL) {

exibirPosOrdem(tree->esq);exibirPosOrdem(tree->dir);printf("%s ", tree->dado.nome);

}}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 37/50

37

Árvores Binárias

Implementação não-recursiva in-ordemvoid inordem_ (arvore arv) {

pilha p;arvore aux;criapilha(&p);aux = arv;

if (vazia(arv)) return;do {

while (aux != NULL) {empilha(&p, aux);aux = (aux->esq);}if (!pilhavazia(p)) {

desempilha(&p, &aux);printf("%d ", aux->dado);aux = (aux->dir);

}} while (!(pilhavazia(p) && aux == NULL));

}

void inordem(arvore arv) {if (!vazia(arv)) {

inordem(arv->esq);printf("%d", arv->info);inordem(arv->dir);

}}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 38/50

38

Árvores Binárias

A função in-ordem recursivaexecutará muito mais rapidamente quesua correspondente iterativa,

contrariando o conceito de querecursividade é mais lenta que aiteração.

Isso porque a procedure iterativa fazchamadas às operações pilhavazia(),empilha() e desempilha()

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 39/50

39

Árvores Binárias

Implementação:

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 40/50

40

Árvores Binárias

Estrutura: // Tipo base dos elementos da arvoretypedef struct elementos {

char nome[100];} t_elemento;

typedef struct no {struct no * esq;t_elemento dado;struct no * dir;

} t_no;

typedef t_no* t_arvore;

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 41/50

41

Árvores Binárias

Criar: // Cria um no vaziot_no * criar ()

{t_no * no = (t_no*) malloc(sizeof(t_no));

if (no)no->esq = no->dir = NULL;

return no;}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 42/50

42

Árvores Binárias

Vazia?: // isVazia - testa se um no eh vazioint isVazia (t_no * no){

return (no == NULL);

}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 43/50

43

Árvores Binárias

Busca por determinado elemento:t_no * busca(t_arvore tree, t_elemento dado){

t_no* achou;if (tree == NULL)

return NULL;if (compara(tree->dado, dado)==0)

return tree;

achou = busca(tree->esq, dado);

if (achou == NULL)

achou = busca(tree->dir, dado);

return achou;}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 44/50

44

Árvores Binárias

Insere a raiz // Insere um noh raiz numa arvore vazia. Retorna 1 se a insercao for bem sucedida, ou0 caso contrario.int insereRaiz(t_arvore* tree, t_elemento dado){

t_no* novo;if (*tree != NULL)return 0; // erro: ja existe raiz

novo = criar();if (novo == NULL)

return 0; // erro: memoria insuficientenovo->dado = dado;

*tree = novo;return 1;

}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 45/50

45

Árvores Binárias

Insere a Direita: // Inserir um filho aa direita de um dado noh

int insereDireita(t_arvore tree, t_elemento pai, t_elemento filho)

{

t_no * f, *p, *novo;

 // verifica se o elemento ja nao existe

f = busca(tree,filho);

if (f != NULL)return 0; // erro: dado ja existente

 // busca o pai e verifica se ja nao possui filho direitop = busca(tree,pai);

if (p == NULL)

return 0; // erro: pai nao encontradoif (p->dir != NULL) return 0; // erro: ja existe filho direito

novo = criar();

if (novo == NULL)

return 0; // erro: memoria insuficiente

novo->dado = filho;p->dir = novo;

return 1;}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 46/50

46

Árvores Binárias

Insere a Esquerda: // Inserir um filho aa direita de um dado noh

int insereEsquerda(t_arvore tree, t_elemento pai, t_elemento filho)

{

t_no * f, *p, *novo;

 // verifica se o elemento ja nao existe

f = busca(tree,filho);

if (f != NULL)return 0; // erro: dado ja existente

 // busca o pai e verifica se ja nao possui filho direitop = busca(tree,pai);

if (p == NULL)

return 0; // erro: pai nao encontradoif (p->esq != NULL) return 0; // erro: ja existe filho direito

novo = criar();

if (novo == NULL)

return 0; // erro: memoria insuficiente

novo->dado = filho;p->esq = novo;

return 1;}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 47/50

47

Árvores Binárias

Exibir:void exibirPreOrdem(t_arvore tree) {

if (tree!=NULL) {

printf("%s ", tree->dado.nome);

exibirPreOrdem(tree->esq);

exibirPreOrdem(tree->dir);

}

}

void exibirInOrdem(t_arvore tree) {

if (tree!=NULL) {exibirInOrdem(tree->esq);

printf("%s ", tree->dado.nome);

exibirInOrdem(tree->dir);}

}

void exibirPosOrdem(t_arvore tree){

if (tree!=NULL) {

exibirPosOrdem(tree->esq);

exibirPosOrdem(tree->dir);printf("%s ", tree->dado.nome);

}}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 48/50

48

Árvores Binárias

Exibir: // Exibir a arvore - Procedimento recursivo, usando um percurso pre-ordem.

 // sugestao de uso: exibirGraficamente(arvore, 10, 10, 3);void exibirGraficamente(t_arvore tree, int col, int lin, int desloc){

 // col e lin sao as coordenadas da tela onde a arvore ira iniciar,

 // ou seja, a posicao da raiz, e desloc representa o deslocamento na tela // (em colunas) de um no em relacao ao no anterior.

if (tree == NULL)return; // condicao de parada do procedimento recursivo

gotoxy(col,lin);printf("%s",tree->dado.nome);if (tree->esq != NULL)

exibirGraficamente(tree->esq,col-desloc,lin+2,desloc/2+1);if (tree->dir != NULL)

exibirGraficamente(tree->dir,col+desloc,lin+2,desloc/2+1);}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 49/50

49

Árvores Binárias

Esvaziar:void esvaziar(t_arvore *tree){

if (*tree == NULL)return;

esvaziar(&(*tree)->esq);

esvaziar(&(*tree)->dir);free(*tree);*tree = NULL;

}

7/13/2019 Árvores Binárias

http://slidepdf.com/reader/full/arvores-binarias-55b08ad8439e9 50/50

Árvores Binárias

Mini-Trabalho;Mostrar rodando.