Árvores Binárias
-
Upload
iranildo-junior -
Category
Documents
-
view
41 -
download
0
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 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;
}