Vous êtes sur la page 1sur 5

rvore Binaria e de Busca Quando ouvimos o termo Aplicao Computacional estamos diretamente nos referindo um programa de computador que

ir fazer diversas manipulaes de dados. A representao desses dados manipulados pela aplicao poder ser feita por diferentes tipos estruturas de dados. Um fator que determina o papel das estruturas no processo de programao de aplicaes a identificao de quo bem as estruturas de dados coincidem com o domnio do problema a ser tratado. Portanto, essencial que as linguagens de programao tenham suporte a uma variedade de tipos e estruturas, para que representem adequadamente os dados manipulados pelas aplicaes. Uma estrutura de dados so formas que podemos distribuir ou relacionar os dados disponveis, de forma a tornar esse relacionamento mais eficiente aos algoritmos que fazem uso dessas estruturas. Alem disso, as estruturas de dados tm larga aplicao na computao em
geral. Sistemas as utilizam para vrias atividades importantssimas, como gerenciamento de memria, execuo de processos, armazenamento e gerenciamento de dados no disco, etc. Uma das mais importantes classes de estrutura de dados em computao so as rvores. Aproveitando-se de sua organizao hierrquica, muitas aplicaes so realizadas utilizando algoritmos bastantes simples, recursivos e com boa eficincia. A principal caracterstica da arvores a relao de hierarquia que existe entre os elementos que a compem. Existe diversas situaes em que poderamos fazer uso de arvores como o organograma de uma empresa, a diviso de um livro em captulos, sees e tpicos, a arvore genealgica de uma pessoa, etc. De uma forma mais terica uma estrutura em rvore um conjunto finito de um ou mais nodos (ns ou vrtices ), sendo que existe um nodo raiz e os demais nodos podem formar sub-rvores. Podemos representar uma arvore de diversas formas como: Forma hierrquica:

Em conjuntos:

Ou em forma de expresso parametrizada:

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

Das diversas formas de representao, a que exibe a melhor forma de visualizao a forma hierrquica, pois podemos identificar facilmente o nodo raiz, as sub-arvores, etc. Uma arvore possui algumas definies: Aresta linha que liga dois nodos. Caminho percurso que no faz chegar em um nodo B qualquer de um nodo A qualquer. Folha ou nodo terminal quando o nodo no possui descendentes. Grau de um nodo numero de nodos filhos de um nodo. Nivel de um nodo numero de nodos existentes no caminho entre a raiz e o prprio nodo. Grau de uma arvore o numero de grau do nodo de maior grau de uma arvore Nvel de uma arvore o nvel do nodo de maior nvel de uma arvore.

Arvores Binarias Em uma arvore binria cada no poder ter no Maximo dois filhos, ou seja, cada nodo ter 0, 1, ou 2 filhos. Para percorrermos um caminho em uma arvore, ou seja, percorrer os seus nodos, poderamos utilizar de 3 caminhamentos usuais que so. O caminho pr-fixado, o infixado e o pos-fixado. O caminho pr-fixado ou pr-ordem, visitaramos a raiz, depois caminharamos para a sub-rvore a esquerda e depois caminariamos para a sub-rvore a direita. No caminho infixado ou em ordem, visitaramos a sub-rvore a esquerda, depois visitaramos a raiz e depois visitaramos a sub-rvore a direita. No caminho pos-fixado ou pos ordem, ou esquerda-direita-raiz, visitaramos a sub-rvore a esquerda, depois visitaramos a subarvore a direita e depois visitaramos a raiz.

Arvore binria de busca As arvores binria de busca so aquelas que os dados so distribudos pelos ns de forma a facilitar a pesquisa de um determinado elemento. A distribuio dos dados feita de tal modo que, em qualquer sub-rvore, todos os elementos situados esquerda da raiz so menores que o elemento da raiz, e todos os situados direita da raiz so maiores que o da raiz. Com essa distribuio, a pesquisa de um elemento qualquer fica mais eficiente. Em qualquer nvel, verifica-se primeiramente a raiz. Se o dado procurado estiver na raiz , a pesquisa est encerrada. Caso contrrio, se o elemento for menor que o da raiz, procura-se na sub-rvore esquerda; se for maior, procura-se na sub-rvore da direita. Mas nunca necessrio procurar nas duas sub-rvores.

Implementando os percursos em Java teramos:

public class No { private No esq; private No dir; private Integer valor; //mtodos de acessos... }

Pr-fixado: public void preFixado (ArvoreNo no) { if(no != null){ System.out.print(no.getInfo()+" "); preFixado (no.getNoE()); preFixado (no.getNoD()); } }

Infixado: public void inFixado (ArvoreNo no) { if(no != null) { inFixado (no.getNoE()); System.out.print(no.getInfo()+" "); inFixado (no.getNoD()); } }

Pos-fixado:
public void posFixado(ArvoreNo no) { if(no != null){ posFixado (no.getNoE()); posFixado (no.getNoD()); System.out.print(no.getInfo()+" "); } }

Alem das operaes de percorrer uma arvore binria, poderamos tambm inserir elementos, buscar o maior elemento, buscar o menor elemento, contar os elementos ou somar os elementos. Em Java teramos: Inserir:

public No Inserir(No novo, No anterior){ if (anterior != null){ if (novo.ObtemValor() < anterior.ObtemValor()) //Como o novo n tem valor menor do que o do n anterior, desce para a esquerda do n anterior. anterior.filho_Esq = this.Inserir(novo, anterior.filho_Esq); else { if(novo.ObtemValor() > anterior.ObtemValor()) //Como o novo n tem valor maior do que o do n anterior, desce para a direita do n anterior. anterior.filho_Dir = this.Inserir(filho, anterior.filho_Dir); else //Caso seja um n j existente, sai do mtodo. return null; } } else { //Insere o novo n como folha. anterior = novo; } return anterior; }

Contagem:
public int Contagem(No n){ if(n==null) return 0; else return 1+Contagem(n.getFilhoEsquerda())+Contagem(n.getFilhoDireita); }

Somar elementos:
public int SomaElementos(No raiz){ if (raiz != null){ soma=this.SomaElementos(raiz.p_Esq)+this.SomaElementos(raiz.p_Dir)+raiz.O btemValor(); return soma; }else return 0; }

Maior elemento:
public int MaiorElemento(No raiz){ if (raiz != null){ if (maior < raiz.ObtemValor()) maior = raiz.ObtemValor(); this.MaiorElemento(raiz.p_Esq); this.MaiorElemento(raiz.p_Dir); return maior; }else return 0; }

Menor elemento:
public int MenorElemento(No raiz){ if (raiz != null){ if (menor > raiz.ObtemValor()) menor = raiz.ObtemValor(); this.MenorElemento(raiz.p_Esq); this.MenorElemento(raiz.p_Dir); return menor;

}else return 0; }