Google
 

terça-feira, 12 de junho de 2007

Árvore binária

Olá pessoal! Todo bom computeiro deve conhecer as estruturas de dados básicas, como listas, pilhas, entre outras. Porém, algumas estruturas de dados que proporcionam uma maior eficiência na busca, inserção e remoção de dados são as árvores. Existem diversos tipos de árvores, como ávores B, B+, B*, Rubro-negras, entre outras. Árvores são estruturas eficientes para buscar, inserir e remover elementos. Hoje eu irei descrever brevemente sobre uma árvore simples, a árvore binária. Definindo de uma forma informal, uma árvore binária é composta por um nó raiz, nós intermediários e nós folhas, sendo que cada nó possui 0, 1 ou 2 filhos. A figura abaixo ilustra um exemplo de uma árvore binária.


Uma árvore binária pode ser implementada facilmente usando-se ponteiros. Porém, com isso é desperdiçado espaço de memória pois para cada nó mantêm-se dois ponteiros. Uma forma eficiente é a de representar árvores binárias em vetores. Dessa forma, a árvore binária acima ficaria da forma (A,B,C,D,E,F,G,-,-,-,-,H,I), caso armazenada em um vetor. As posições com o caracter '-' indicam posições vazias. Por que? Foi escolhida essa forma pois adotou-se o seguinte: para cada nó i, seus filhos estão em 2*i+1 e 2*i+2. Assim:

  • A está na posição zero e seus filhos nas posições 1 e 2
  • B está na posição um e seus filhos nas posições 3 e 4
  • e assim por diante..
Mas por que não armazenar H e I nas posições 7 e 8 do vetor? Porque futuramente os filhos de D podem ser inseridos na árvore e também porque isso invalidaria o acesso eficiente aos filhos de um nó simplesmente calculando-se 2*i+1 e 2*i+2.
Descrevi brevemente o que é uma árvore binária, porém um maior aprofundamento pode ser feito no livro "Introdução a algoritmos", Cormen, ou até mesmo fazendo-se uma busca pelo google. Segue o link para a implementação descrita neste post, que eu fiz para um trabalho para a disciplina de ED da pós graduação. Qualquer bug, me informem! :-D.
Árvore binária implementada em vetor, na linguagem C.

[]'s a tds,
André Ferrizzi.

8 comentários:

Bruno disse...

estou fazendo ciências da computação mas ainda estou aprendendo uma linguagem q no caso eh c, mas ja tive contato com um amigo e ele tava estudando uma materia em q tinha esse lance de árvore, logo achei bem interessante oq vc postou aqui mas eu acho q essa árvore está errada, pq seguindo a logica q vc disse dos 2*i+1 e 2*1+2 os filhos do f seriam 11 e 12, estando eu certo ou errado gostaria de uma resposta pois estando certo eh sinal de q entendi corretamente e caso eu esteja errado se vc poderia tentar me explicar de uma forma mais simples

Ferrizzi disse...

Olá Bruno!
Você está certo, os filhos do f são o 11 e o 12, eu havia errado na figura. Já corrigi a figura e postei novamente.
Muito obrigado pela correção!
Abraço!

Bruno disse...

obrigado pela atenção, hj tomei conhecimento desse site e achei bem interessante, vc acaba de ter mais um leitor!!!

fabio disse...

Boa noite, necessito implementar uma árvore binária utilizando um vetor mas em python, não estou conseguindo ter acesso ao codigo em C, do seu Blog, teria como vc enviar o codigo para:faguanil@gmail.com ou faguanil@hotmail.com

Obrigado.

wedla disse...

Olá!

Olha, gostei muito do post e estou precisando urgentemente desse código, mas não consegui fazer o download. Teria como enviá-lo ao meu email ou coisa do tipo? Qualquer coisa: mwedla@yahoo.com.br

Davi d'Claus disse...

Poderia por favor me enviar este codigo...
Não to conseguindo fazer download.
se poder envie-o pra wdaslwn51@hotmail.com...


É sério sou aluno de eng eletrica da UFPA e to fazendo um trabalho sobre o assunto.

P.S.: gostei do site...
rsrsrs

José Arlan disse...

Por favor, poderia me enviar esse código, é urgente! tenho que entregar um trabalho com árvore binaria em vetor, faço Análise e Desenvolvimento de Sistemas, meu email é: jason_satsirorret@hotmail.com
Agradeço!!!

Bimtyz disse...

Vlw pela formula da representação de árvore em vetor (y)