Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

%=Rodrigo %

Balancear uma arvore binaria em C

Recommended Posts

OLá Pessoal alguem pode me ajudar.. Eu precisando Balancear uma arvore binaria, só que no caso os elementos ja estao inseridos na arvores quero apenas balancear, nao inserir balancendo.. Alguem conehece algum site, alguma função.. Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde,

 

acho q este exemplo pode te ajudar.

 

Até mais,

 

Renato J. C. Lima

 

 

// Arvore Binaria de Busca (A.B.B.)#include <iostream>using namespace std;// Classe Noclass No {   public: 	   int info;	   No *pSubEsq, *pSubDir;	   // Construtor	   No() : info(0), pSubEsq(NULL), pSubDir(NULL) {	   }	   	   // Destrutor	   ~No() {	   }};// Classe ABBclass ABB {   private:	   No *pRaiz;   public:	   // Construtor	   ABB() : pRaiz(NULL) {	   }	   // Inserir em A.B.B.	   void inserirABB(int valor) {		  		  No *pNovo = new No();		  pNovo->info = valor;		  if ( pRaiz == NULL ) {			  pRaiz = pNovo;		  }else {			  No *pAtual = pRaiz;			  No *pAncestral = NULL;			  while ( true ) {				  pAncestral = pAtual;				  if ( valor < pAtual->info ) {					  pAtual = pAtual->pSubEsq;					  if ( pAtual == NULL ) {						  pAncestral->pSubEsq = pNovo;						  return;					  }				  }else {					  if ( valor == pAtual->info ) {						  delete pNovo;						  return;					  }else {						  pAtual = pAtual->pSubDir;						  if ( pAtual == NULL ) {							  pAncestral->pSubDir = pNovo;							  return;						  }					  }				  }			  };		  }	   }	   // preOrdem:	   void preOrdem(No *pRaiz) {		   if (pRaiz != NULL) {			   cout << " " << pRaiz->info;			   preOrdem(pRaiz->pSubEsq);			   preOrdem(pRaiz->pSubDir);		   }	   }	   // inOrdem:	   void inOrdem(No *pRaiz) {		   if (pRaiz != NULL) {			   inOrdem(pRaiz->pSubEsq);			   cout << " " << pRaiz->info;			   inOrdem(pRaiz->pSubDir);		   }	   }	   	   // posOrdem:	   void posOrdem(No *pRaiz) {		   if (pRaiz != NULL) {			   posOrdem(pRaiz->pSubEsq);			   posOrdem(pRaiz->pSubDir);			   cout << " " << pRaiz->info;		   }	   }	   // Chamada dos Percursos pre, in e pos-ordem:	   void percorrerABB(void) {		   cout << "\npre: ";		   preOrdem(pRaiz);		   cout << "\nin: ";		   inOrdem(pRaiz);		   cout << "\npos: ";		   posOrdem(pRaiz);	   }	   //  Calculo do nro. de nos:	   int nroNos(No *pRaiz) {		   int n1=0, n2=0;		   if (pRaiz == NULL) return ( 0 );		   else {			   n1 = nroNos(pRaiz->pSubEsq);			   n2 = nroNos(pRaiz->pSubDir);			   return ( n1 + n2 + 1 );		   }	   }	   //  Chamada e exibicao da quantidade de nos:	   void quantidadeNos(void) { 		   int qtd = nroNos(pRaiz);		   cout << "\nA quantidade de nos e': " << qtd;	   }	   //  Calculo do Somatorio das Chaves:	   int somatorioNos(No *pRaiz) {		   int s1=0, s2=0;		   if (pRaiz == NULL) return ( 0 );		   else {			   s1 += somatorioNos(pRaiz->pSubEsq);			   s2 += somatorioNos(pRaiz->pSubDir);			   return ( pRaiz->info + s1 + s2 );		   }	   }	   	   //  Chamada e exibicao da Media Aritmetica das Chaves:	   void somaChavesABB(void) { 		   int soma = somatorioNos(pRaiz);		   cout << "\nA somatoria das chaves e': " << soma;	   }	   //  Chamada e exibicao da Somatoria das Chaves:	   void mediaAritmeticaABB(void) { 		   float media = (float) somatorioNos(pRaiz) / (float) nroNos(pRaiz);		   cout << "\nA Media Aritmetica das chaves e': " << media;	   }};// Programa Principalvoid main (void) {	ABB exemplo;	exemplo.inserirABB(25);	exemplo.inserirABB(10); 	exemplo.inserirABB(12);	exemplo.inserirABB(16);	exemplo.inserirABB(15);	exemplo.inserirABB(30);	exemplo.inserirABB(45);	exemplo.inserirABB(36);	exemplo.inserirABB(33);	exemplo.inserirABB( 4);	exemplo.percorrerABB();	exemplo.quantidadeNos();	exemplo.somaChavesABB();	exemplo.mediaAritmeticaABB();	cout << endl;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.