Upload
tiagosilva
View
26
Download
0
Embed Size (px)
DESCRIPTION
Arvore binaria em c
Citation preview
Introdução
• Estruturas estudadas: listas, pilhas e filas.
• Entretanto, elas não são adequadas para• Entretanto, elas não são adequadas pararepresentar dados que devem ser dispostos demaneira hierárquica
• Árvores são estruturas de dados adequadaspara a representação de hierarquias.
Introdução
• Exemplos de estruturas em forma de árvores são:
– O organograma de uma empresa;
– A divisão de um livro em capítulos, seções, tópicos, etc;
– A árvore genealógica de uma pessoa.
– Organização de pastas e diretórios de arquivos num disco. num disco.
Definição
• De um modo um pouco mais formal, podemos dizer que uma árvore é um conjunto finito de um ou mais nodos (nós uma árvore é um conjunto finito de um ou mais nodos (nós ou vértices), tais que:
– Existe um nodo denominado raiz;
– Os demais nodos formam m>= 0 conjuntos disjuntos s1, s2, ... , sm, tais que cada um desses conjuntos também é uma árvore (denominada sub-árvore).uma árvore (denominada sub-árvore).
– A forma convencional de representar uma árvore está indicado na figura seguinte. Esta árvore tem nove nós sendo A o nó raiz.
Representação
• Os conjuntos das sub-árvores tem de ser disjuntos, portanto, aestrutura indicada na figura seguinte não é uma árvore.
Cada nó só pode ter um pai
Definições
• Se n é um nó da árvore T então Tn indica uma sub-árvore de Tcom raiz no nó n.
• Os nós n1, n2, ..., nk das sub-árvores de Tn são chamados de filhos de n e n é o pai destes nós, que são nós irmãos. Os nós B e C são filhos de A e nós irmãos.
Nó filho Nó filho e irmão do nó B
n
Nó filho Nó filho e irmão do nó B
Nó filho Nó filho e irmão do nó H
Definições
• Nós sem filhos como os nós D, H, I, F e G são chamados de folhas.
• A sub-árvore da esquerda do nó A tem raiz em B e a sub-árvore da• A sub-árvore da esquerda do nó A tem raiz em B e a sub-árvore dadireita tem raiz em C, isto está indicado pelos dois ramos saindo deA.
• A ausência de um ramo na árvore indica uma sub-árvore vazia, comoa sub-árvore da direita do nó B.
Raiz da sub-árvore esquerda Raiz da sub-árvore direita
nó folha
nó folhanós folha
Raiz da sub-árvore esquerda Raiz da sub-árvore direita
Definições
• O nível de um nó n pode ser definido do seguinte modo: o nó raiz tem nível 0, os outros nós tem um nível que é nó raiz tem nível 0, os outros nós tem um nível que é maior uma unidade que o nível de seu pai. Na árvore da figura anterior temos nós nos seguintes níveis:
– nível 0 = A
– nível 1 = B, C
– nível 2 = D, E, F, G
– nível 3 = H, I– nível 3 = H, I
Representações
• Representação por parênteses aninhados
( A (B) ( C (D (G) (H)) (E) (F (I)) ) )( A (B) ( C (D (G) (H)) (E) (F (I)) ) )
Diagrama de Venn
Grafo
Árvore Binária
• Um importante tipo de árvore é a árvore binária.
• Em uma árvore binária cada nó tem no máximo• Em uma árvore binária cada nó tem no máximoduas sub-árvores, e quando há somente umapresente é necessário distinguir entre sub-árvoreesquerda e direita.
Árvore Binária
• Uma árvore binária A é um conjunto finito deum ou mais nodos (ou nós), tal que:um ou mais nodos (ou nós), tal que:– Existe um nó especial denominado raiz da árvore;
– Os restantes n-1 nós formam dois conjuntosdisjuntos, Aesq e Adir, chamados de subárvoresesquerda e direita da raiz, as quais são tambémárvores binárias.
Aplicações
• Como seria a inserção da seguinte seqüência em uma árvore binária?em uma árvore binária?
• A inserção em uma árvore binária deve seguir a seguinte lei:
7 8 2 5 3 10 4
seguinte lei: – Todos elementos menores que a raiz devem ficar na
sub-árvore esquerda;
– Todos os elementos maiores que a raiz devem ficar na sub-árvore direita.
Percursos em Árvores Binárias
• O primeiro método, conhecido como percursoem PRÉ-ORDEM, implica em executarem PRÉ-ORDEM, implica em executarrecursivamente os três passos na seguinteordem:
– Visitar a raiz;
– Percorrer a sub-árvore da esquerda em pré-ordem;
– Percorre a sub-árvore da direita em pré-ordem.
Resumindo : R-E-D
Aplicação
• Para a seguinte árvore binária o resultado do caminhamento PRÉ-ORDEM seria:do caminhamento PRÉ-ORDEM seria:
F B A D C E H G I
Aplicação
• Para percorrer a árvore em ORDEMSIMÉTRICA (ou EM-ORDEM) executa-seSIMÉTRICA (ou EM-ORDEM) executa-serecursivamente os três passos na seguinteordem:– Percorrer a sub-árvore da esquerda em ordem
simétrica;
– Visitar a raiz;– Visitar a raiz;
– Percorrer a sub-árvore da direita em ordemsimétrica.
Resumindo: E-R-D
Aplicação
• Para a seguinte árvore binária o resultado do caminhamento EM-ORDEM seria:caminhamento EM-ORDEM seria:
A B C D E F G H I.
Aplicação
• O percurso conhecido como PÓS-ORDEM é feito a partir dos três passos na seguinte feito a partir dos três passos na seguinte ordem: – Percorrer a sub-árvore da esquerda em pós-ordem;
– Percorrer a sub-árvore da direita em pós-ordem;
– Visitar a raiz;
Resumindo: E-D-RResumindo: E-D-R
Aplicação
• Para a seguinte árvore binária o resultado do caminhamento PÓS-ORDEM seria:do caminhamento PÓS-ORDEM seria:
A C E D B G I H F.
Percurso em Pré-Ordem (RED)
• Algoritmo básico:1. Se árvore vazia → fim 1. Se árvore vazia → fim
2. visitar o nó raiz
3. percorrer em pré-ordem a sub-árvore esquerda
4. percorrer em pré-ordem a sub-árvore direita
ABDCEGFHIABDCEGFHI
Percurso em Em-Ordem
• Algoritmo básico:1. Se árvore vazia → fim 1. Se árvore vazia → fim
2. percorrer em ordem a sub-árvore esquerda
3. visitar o nó raiz
4. percorrer em ordem a sub-árvore direita
DBAEGCHFIDBAEGCHFI
Percurso em Pós-Ordem
• Algoritmo básico:1. Se árvore vazia → fim 1. Se árvore vazia → fim
2. percorrer em pós-ordem a sub-árvore esquerda
3. percorrer em pós-ordem a sub-árvore direita
4. visitar o nó raiz
DBGEHIFCADBGEHIFCA
Aplicação
• Faça você sozinho, utilizando os 3 tipos de caminhamento percorra a seguinte árvore caminhamento percorra a seguinte árvore binária:
+ -
*
A /
B C
D *
E F
Estrutura de Dados de Árvore Binária
typedef struct TipoItem{int cod;int cod;
};
typedef struct TipoNo *TipoApontador;
typedef struct TipoNo {TipoItem Reg;TipoItem Reg;TipoApontador Esq, Dir ;
};
typedef TipoApontador TipoArvore;
Inicializa a Árvore
void Inicializa (TipoArvore *Arvore)void Inicializa (TipoArvore *Arvore){
*Arvore = NULL ; }
Pesquisa item
void Pesquisa( TipoItem *x , TipoApontador *p){
if (*p == NULL){ if (*p == NULL){ printf ( "Erro : Registro nao esta presente na arvore \n" ) ; return ;
}if ( x->cod < (*p)->Reg.cod){
Pesquisa(x, &(*p)->Esq) ; return ;
}}if ( x->cod > (*p)->Reg.cod)
Pesquisa(x, &(*p)->Dir);else
*x = (*p)->Reg;}
Insere
void Insere ( TipoItem x , TipoApontador *p){
if (*p == NULL){ if (*p == NULL){ *p = (TipoApontador)malloc(sizeof(TipoNo));(*p)->Reg = x;(*p)->Esq = NULL;(*p)->Dir = NULL;return;
}if(x.cod < (*p)->Reg.cod){
Insere (x, &(*p)->Esq);Insere (x, &(*p)->Esq);return;
}else if( x.cod > (*p)->Reg.cod)
Insere (x, &(*p)->Dir );else printf ("Erro:Registro ja existe na arvore\n");
}
Caminha na Árvore
void PreOrdem (TipoArvore p){
if (p == NULL ) return;
void PosOrdem (TipoArvore p){
if (p == NULL ) return;if (p == NULL ) return;printf ( "%ld \n" , p->Reg.cod);PreOrdem (p->Esq) ;PreOrdem (p->Dir ) ;
}
void EmOrdem (TipoArvore p){
if (p == NULL ) return;
if (p == NULL ) return;PosOrdem (p->Esq) ;PosOrdem (p->Dir ) ;printf ("%ld \n”, p->Reg.cod) ;
}
if (p == NULL ) return;EmOrdem (p->Esq) ;printf ("%ld \n”, p->Reg.cod);EmOrdem (p->Dir ) ;
}