terça-feira, 2 de dezembro de 2008

Implementação de Árvore usando C++

A seguir, postarei os fontes necessários para a implementação de uma árvore. O código não propicia nenhuma interface gráfica para o programa, mas o torna capaz de inserir elementos na árvore e imprimí-los em ordem crescente e decrescente.

Obs.: O método para exclusão de elementos não foi implementado.


#include

using namespace std;

struct noh {
int num;
noh *esq;
noh *dir;
};

//estrutura arvore
struct ArvoreBinaria {
noh *raiz;
int profundidade;
int quantidade;
};

//inicializar arvore
void Inicializa(ArvoreBinaria *arvore){
arvore->raiz = NULL;
arvore->profundidade = -1;
arvore->quantidade = 0;
};

noh *criarnoh(int n) {
noh *novo;
novo = new noh;
if ( novo != NULL ){
novo -> num = n;
novo -> esq = NULL;
novo -> dir = NULL;
};
return (novo);
};

noh *Procurar(noh *elem, int elemproc, int *prof, bool *achou) {
*achou = false;
if (elem == NULL)
return NULL;
*prof = *prof + 1;
if (elemproc > elem -> num){
if (elem -> dir != NULL){
return Procurar(elem -> dir, elemproc,prof,achou);
}else{
return (elem);
}
}else{
if (elemproc <> num){
if (elem -> esq != NULL){
return Procurar(elem -> esq, elemproc,prof,achou);
}else{
return (elem);
}
}else{
//Encontrou o elemento
*achou = true;
return (elem);
}
};
};

int Insere(ArvoreBinaria *arvore, int valor) {
//Verificar se eh o primeiro elemento
if ( arvore->raiz == NULL ) {
arvore->raiz = criarnoh(valor);
if ( arvore->raiz == NULL ){
return -1; //Erro
}else{
arvore->profundidade = 0;
arvore->quantidade = 1;
return 1; //Inserido com sucesso
};
};

//Nao eh o primeiro elemento, procurar se existe
noh *NoElementoOuPai;
int prof = -1;
bool achou = false;
NoElementoOuPai = Procurar(arvore->raiz,valor,&prof,&achou);
if (achou == false){
//Inserir elemento na arvore
noh *novo;
novo = criarnoh(valor);
if ( novo == NULL ){
return -1;
}else{
if ( valor <>num )
NoElementoOuPai -> esq = novo;
else
NoElementoOuPai -> dir = novo;
prof++;
if ( prof > arvore->profundidade )
arvore->profundidade = prof;
arvore->quantidade++;
return 1;
}
}else{
//Encontrou o elemento
return 0;
};
};

void MostraCrescente (noh *elem){
if (elem != NULL){
MostraCrescente(elem -> esq);
cout<<> num << " "; MostraCrescente(elem -> dir);
};
};
void MostraDecrescente (noh *elem){
if (elem != NULL){
MostraCrescente(elem -> dir);
cout<<> num << " "; MostraCrescente(elem -> esq);
};
};

int main(){
ArvoreBinaria *arvore;
arvore = new ArvoreBinaria;
Inicializa (arvore);
int aux = 0;
//int count = 1;
while (aux != -1){
cout<< " Informe o valor: "; cin>> aux;
if (aux != -1)
Insere(arvore, aux);
//count++;
};
int opcao;
cout<< "Deseja ver os elementos em ordem crescente ou decrescente?"; cout<< "\n\n\t crescente: 1\n"; cout<< "\n\t decrescente: 2\n"; cin>>opcao;

switch(opcao){
case 1:
MostraCrescente(arvore->raiz);
break;
case 2:
MostraCrescente(arvore->raiz);
}

system("pause>>null");
return 1;
}

Bom proveito

Um comentário: