Estrutura de Dados Árvore Binária Exemplo de Implementação Prof. Pedro Luís Antonelli Anhanguera Educacional
Lista Encadeada - Exemplo Exemplo de código para a implementação de uma árvore binária encadeada em C, para armazenar valores inteiros, utilizado o compilador GNU g++ #include <iostream> typedef struct arvore char info; struct arvore *esq; struct arvore *dir; Arv;
Funções de criação e teste Arv* inicializa( void ) return NULL; // função que inicializa uma árvore //------------------------------------------------------------------------ int vazia( Arv* a ) return a==null; // função que testa se a árvore está vazia
Função que cria um árvore Arv* cria(char c, Arv* sub_arv_e, Arv* sub_arv_d ) Arv* p = ( Arv* )malloc( sizeof( Arv ) ); p->info = c; p->esq = sub_arv_e; p->dir = sub_arv_d; return p;
Função que imprime a árvore void imprime ( Arv* a ) if (!vazia( a ) ) printf(" %c ", a->info); imprime(a->esq); imprime(a->dir); // mostra raiz // mostra sae // mostra sad
Função que libera a memória alocada para a árvore Arv* libera ( Arv* a ) if (!vazia( a ) ) libera(a->esq); libera(a->dir); free(a); return NULL; // libera sae // libera sad // libera raiz
Função que retorna a altura de uma árvore int altura (Arv* a) if ( vazia( a ) ) return -1; else if (altura ( a->esq ) > altura ( a->dir ) ) return 1 + altura ( a->esq ); else return 1 + altura ( a->dir );
Função que procura um elemento em uma árvore int busca (Arv* a, char c) if (vazia(a)) return 0; // árvore vazia: não encontrou else return a->info==c busca(a->esq,c) busca(a->dir,c);
Teste das funções criadas int main( ) Arv* no_1= cria( D', inicializa(),inicializa() ); // sub-árvore D'
Teste das funções criadas Arv* no_1= cria( D', inicializa(),inicializa() ); Arv* no_2= cria( B', inicializa(), no_1 ); // sub-árvore com D' // sub-árvore com B'
Teste das funções criadas Arv* no_1= cria( D', inicializa(),inicializa() ); Arv* no_2= cria( B', inicializa(), no_1 ); Arv* no_3= cria( E', inicializa(), inicializa() ); //sub-árvore com 'D' // sub-árvore com 'B' // sub-árvore com 'E'
Teste das funções criadas Arv* no_1= cria( D', inicializa(),inicializa() ); Arv* no_2= cria( B', inicializa(), no_1 ); Arv* no_3= cria( E', inicializa(), inicializa() ); Arv* no_4= cria( F', inicializa(), inicializa() ); //sub-árvore com D' // sub-árvore com B' // sub-árvore com E' // sub-árvore com F'
Teste das funções criadas Arv* no_1= cria( D', inicializa(),inicializa() ); Arv* no_2= cria( B', inicializa(), no_1 ); Arv* no_3= cria( E', inicializa(), inicializa() ); Arv* no_4= cria( F', inicializa(), inicializa() ); Arv* no_5= cria( C, no_3, no_4); //sub-árvore com D' // sub-árvore com B' // sub-árvore com E' // sub-árvore com F' // sub-árvore com C'
Arv* no_1= cria( D', inicializa(),inicializa() ); //sub-árvore com D' Arv* no_2= cria( B', inicializa(), no_1 ); // sub-árvore com B' Arv* no_3= cria( E', inicializa(), inicializa() ); // sub-árvore com E' Arv* no_4= cria( F', inicializa(), inicializa() ); // sub-árvore com F' Arv* no_5= cria( C, no_3, no_4); // sub-árvore com C' Arv* arvore = cria( A', no_2, no_5 ); // árvore com raiz A'
printf("arvore antes do acrescimo dos nos: x, y, z \n \n"); imprime(arvore); printf("\n \n altura da arvore = %d \n \n ",altura(arvore));
arvore->esq->esq = cria('x', cria('y',inicializa(),inicializa()), cria('z',inicializa(),inicializa()) ); printf("\n \n Arvore apos o acrescimo dos nos: x, y, z \n \n"); imprime(arvore); printf("\n \n altura da arvore = %d \n \n ",altura(arvore));
arvore->dir->esq = libera( arvore->dir->esq ); printf("\n \n Arvore apos a retirada do no: e \n \n "); imprime(arvore); printf("\n \n altura da arvore = %d \n \n ",altura( arvore ) );
char elemento; printf("digite o elemento a ser procurado: "); scanf("%c",&elemento); if( busca(arvore, elemento)!= 0 ) printf("\n Elemento encontrado! " ); else printf("\n Elemento não encontrado! " );
libera(arvore); system("pause"); return EXIT_SUCCESS;
Exercícios: 1- Modificar o código apresentado para que o mesmo construa uma árvore binária completa de altura 3; 2- Implementar as funções para imprimir essa árvore das quatro maneiras vistas em aula ( ordem, pré-ordem, pós-ordem e em nível ). Envia para o email ed_2015@pedraorc.com.br até 24/11/2015
BIBLIOGRAFIA W. Celes, W. R. Cerqueira, J.L. Rangel. Introdução a Estruturas de Dados - com técnicas de programação em C Ed. Campus TENENBAUM, Aaron M. Estrutura de Dados Usando C. 1ª ed. São Paulo: PEARSON EDUCATION, 2005. VELOSO, Paulo A. S.. Estrutura de Dados. 1ª ed. Rio de Janeiro: Campus, 1996. PEREIRA, Silvio do Lago. Estrutura De Dados Fundamentais : Conceitos E Aplicações. 12ª ed. São Paulo: Érica, 2008
MANZANO, José Augusto N. Garcia. Algoritmos : Lógica para desenvolvimento de programação de computadores. 21ª ed.são Paulo: Érica, 2008. FORBELLONE, A. L.. Lógica De Programação. 1ª ed. São Paulo: Pearson, 2008. CORMEN, Thomas H.. Algoritmos : Teoria e Prática. 2ª ed. Rio de Janeiro: Campus, 2002. http://www.jacintomendes.eti.br/mackenzie/peii/aulas/ sandra/peii_aula12.pdf. Acesso em 02/02/2012 http://www.dainf.ct.utfpr.edu.br/~karla/ Acesso em 02/02/2012 http://www.rcosta62br.unifei.edu.br Acesso em 03/02/2012 http://gaveta-virtual.blogspot.com.br/2011/06/filas.html Acesso em 10/04/2012