You are on page 1of 5

Árvore Binaria e de Busca Quando ouvimos o termo “Aplicação Computacional” estamos diretamente nos referindo um programa de computador que

irá fazer diversas manipulações de dados. A representação desses dados manipulados pela aplicação poderá ser feita por diferentes tipos estruturas de dados. Um fator que determina o papel das estruturas no processo de programação de aplicações é a identificação de quão bem as estruturas de dados coincidem com o domínio do problema a ser tratado. Portanto, é essencial que as linguagens de programação tenham suporte a uma variedade de tipos e estruturas, para que representem adequadamente os dados manipulados pelas aplicações. Uma estrutura de dados são formas que podemos distribuir ou relacionar os dados disponíveis, de forma a tornar esse relacionamento mais eficiente aos algoritmos que fazem uso dessas estruturas. Alem disso, as estruturas de dados têm larga aplicação na computação em
geral. Sistemas as utilizam para várias atividades importantíssimas, como gerenciamento de memória, execução de processos, armazenamento e gerenciamento de dados no disco, etc. Uma das mais importantes classes de estrutura de dados em computação são as árvores. Aproveitando-se de sua organização hierárquica, muitas aplicações são realizadas utilizando algoritmos bastantes simples, recursivos e com boa eficiência. A principal característica da arvores é a relação de hierarquia que existe entre os elementos que a compõem. Existe diversas situações em que poderíamos fazer uso de arvores como o organograma de uma empresa, a divisão de um livro em capítulos, seções e tópicos, a arvore genealógica de uma pessoa, etc. De uma forma mais teórica uma estrutura em árvore é um conjunto finito de um ou mais nodos (nós ou vértices ), sendo que existe um nodo raiz e os demais nodos podem formar sub-árvores. Podemos representar uma arvore de diversas formas como: Forma hierárquica:

Em conjuntos:

Ou em forma de expressão parametrizada:

(A(B(D()E()))(C(F())))

Folha ou nodo terminal – quando o nodo não possui descendentes. visitaríamos a sub-árvore a esquerda. depois caminharíamos para a sub-árvore a esquerda e depois caminariamos para a sub-árvore a direita. Com essa distribuição. depois visitaríamos a raiz e depois visitaríamos a sub-árvore a direita. cada nodo terá 0. visitaríamos a raiz. ou esquerda-direita-raiz. Grau de um nodo – numero de nodos filhos de um nodo. No caminho infixado ou em ordem. depois visitaríamos a subarvore a direita e depois visitaríamos a raiz. procura-se na sub-árvore da direita. O caminho pré-fixado. visitaríamos a sub-árvore a esquerda. percorrer os seus nodos. em qualquer sub-árvore. e todos os situados à direita da raiz são maiores que o da raiz. Caso contrário. ou seja.Das diversas formas de representação. Mas nunca é necessário procurar nas duas sub-árvores. as sub-arvores. etc. Em qualquer nível. Uma arvore possui algumas definições:        Aresta – linha que liga dois nodos. se for maior. 1. se o elemento for menor que o da raiz. ou 2 filhos. a que exibe a melhor forma de visualização é a forma hierárquica. A distribuição dos dados é feita de tal modo que. Para percorrermos um caminho em uma arvore. poderíamos utilizar de 3 caminhamentos usuais que são. O caminho pré-fixado ou pré-ordem. a pesquisa de um elemento qualquer fica mais eficiente. a pesquisa está encerrada. procura-se na sub-árvore esquerda. . o infixado e o pos-fixado. pois podemos identificar facilmente o nodo raiz. ou seja. No caminho pos-fixado ou pos ordem. Nivel de um nodo – numero de nodos existentes no caminho entre a raiz e o próprio nodo. Arvore binária de busca As arvores binária de busca são aquelas que os dados são distribuídos pelos nós de forma a facilitar a pesquisa de um determinado elemento. todos os elementos situados à esquerda da raiz são menores que o elemento da raiz. Arvores Binarias Em uma arvore binária cada no poderá ter no Maximo dois filhos. verifica-se primeiramente a raiz. Grau de uma arvore – é o numero de grau do nodo de maior grau de uma arvore Nível de uma arvore – é o nível do nodo de maior nível de uma arvore. Se o dado procurado estiver na raiz . Caminho – percurso que no faz chegar em um nodo B qualquer de um nodo A qualquer.

contar os elementos ou somar os elementos.getNoE()).getNoD()).getInfo()+" "). } } Infixado: public void inFixado (ArvoreNo no) { if(no != null) { inFixado (no. preFixado (no.. System.print(no.getInfo()+" "). private Integer valor. private No dir. System.Implementando os percursos em Java teríamos: public class No { private No esq.getInfo()+" "). Em Java teríamos: Inserir: .out. } } Pos-fixado: public void posFixado(ArvoreNo no) { if(no != null){ posFixado (no.getNoD()).print(no. posFixado (no. buscar o maior elemento.out. buscar o menor elemento.getNoE()).getNoD()). preFixado (no. //métodos de acessos. inFixado (no.print(no.getNoE()). poderíamos também inserir elementos.. } } Alem das operações de percorrer uma arvore binária. } Pré-fixado: public void preFixado (ArvoreNo no) { if(no != null){ System.out.

this. } Somar elementos: public int SomaElementos(No raiz){ if (raiz != null){ soma=this. sai do método. } return anterior.SomaElementos(raiz.MaiorElemento(raiz.O btemValor().filho_Esq). } Menor elemento: public int MenorElemento(No raiz){ if (raiz != null){ if (menor > raiz. return menor. this. anterior.SomaElementos(raiz.ObtemValor()) menor = raiz. } } else { //Insere o novo nó como folha. }else return 0. else //Caso seja um nó já existente. anterior = novo.p_Dir). return soma.MenorElemento(raiz.ObtemValor()) //Como o novo nó tem valor maior do que o do nó anterior.Inserir(filho.filho_Esq = this.filho_Dir). anterior.public No Inserir(No novo.ObtemValor() < anterior. desce para a esquerda do nó anterior.MenorElemento(raiz. return maior. desce para a direita do nó anterior. else return 1+Contagem(n.p_Esq)+this.ObtemValor()) //Como o novo nó tem valor menor do que o do nó anterior. this.ObtemValor().getFilhoDireita). return null.p_Esq). No anterior){ if (anterior != null){ if (novo.MaiorElemento(raiz.p_Dir).getFilhoEsquerda())+Contagem(n. } Contagem: public int Contagem(No n){ if(n==null) return 0. }else return 0.Inserir(novo. } Maior elemento: public int MaiorElemento(No raiz){ if (raiz != null){ if (maior < raiz. anterior.ObtemValor(). . else { if(novo. this.ObtemValor()) maior = raiz.filho_Dir = this.p_Dir)+raiz.p_Esq). anterior.ObtemValor() > anterior.

}else return 0. } .