34
Ciência da Computação Árvores

Arvore Binaria C

Embed Size (px)

DESCRIPTION

Arvore binaria em c

Citation preview

Ciência da Computação

Árvores

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

Representação – nó raiz

Nó Raiz

Representação – sub-árvore direita

Representação – sub-árvore esquerda

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

Definições

• A altura de uma árvore é dada pelo nível mais alto da árvore.

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.

Exemplo de árvore binária

Á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.

Aplicação

Agora tente você sozinho, insira as seguinte seqüências: 5 3 7 2 4 6 1, e QUESTAO FCIL

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 ) ;

}