Oi, boa noite a todos. Estou com muita dificuldade em um programa que fiz aqui. Ele esta em C++, é uma árvore de dados. Ela tem um menu, com vários cases (casos). Não estou conseguindo realizar uma busca por elemento específico e informar quantas comparações são necessárias. Alguém pode me ajudar?
O código é esse:
// a17p_01_tree.cpp - Cria uma árvore binária - binary tree
#include
using namespace std;
#include “Treenode.h” // definição da classe TreeNode
TreeNode* createTree(); // 1) para criar uma árvore
void insertTree ( TreeNode*, int ); // 2) para o nó de inserção na Árvore
void printinOrderTraversal ( TreeNode* ); // 4) para imprimir inOrderTraversal Tree ( Em ordem )
void printTree ( TreeNode*, int );
void printpreOrderTraversal ( TreeNode* ); // 7) para imprimir a Árvore em preOrderTraversal
void printpostOrderTraversal ( TreeNode* );
//void deleteelementspecificTree ( TreeNode* );
void searchs_pecific_comparisonsTree ( TreeNode* );
int heightTree ( TreeNode* );
int main()
{
TreeNode *rootNodePtr = 0; // ponteiro para a raiz
int d, choice;
//int k;
//cout << “\n Qual o elemento chave voce quer apagar?”;
//cin >> k;
do // realiza ações selecionadas pelo usuário
{
cout << "\n\n_______________________________________________________________________\n";
cout << "Escolha uma das seguintes operacoes para Arvore:\n\n"
<< " 1) para criar uma Arvore\n"
<< " 2) para o no de insercao\n"
<< " 3) para imprimir Arvore em Ordem Transversal\n"
<< " 5) ao final do tratamento da Arvore\n"
<< " 6) Impressao da Arvore em niveis\n"
<< " 7) Impressao da Arvore em Pre - Ordem Transversal\n"
<< " 8) Impressao da Arvore em Pos - Ordem Transversal\n"
<< " 9) Altura da Arvore\n"
<< " 10) Apagar um elemento especifico\n";
cin >> choice;
switch ( choice )
{
case 1:
rootNodePtr = createTree();
break;
case 2:
if ( rootNodePtr == 0 )
{
cout << "\n A Arvore esta vazia, a criacao do ROOT \n";
rootNodePtr = createTree();
}
else
{
cout << "\n Os dados de entrada do no = ";
cin >> d;
insertTree ( rootNodePtr, d );
}
break;
case 3:
if ( rootNodePtr == 0 )
cout << "\n A Arvore esta vazia!!!\n";
else
{
cout << "\n_______________________________Imprimir Arvore em Ordem Transversal:________________________________\n" << endl << endl;
printinOrderTraversal ( rootNodePtr );
}
break;
default:
cout << "Escolha a opcao correta" << endl;
break;
case 6:
if ( rootNodePtr == 0 )
cout << "\n ________________________________________Imprimir Arvore em niveis:_______________________________________________\n" << endl << endl;
printTree ( rootNodePtr, 0 );
break;
case 7:
if ( rootNodePtr == 0 )
cout << "\n A Arvore esta vazia!!!\n";
else
{
cout << "\n________________________________Impressao da Arvore em pre-Ordem Transversal_________________________________________\n" << endl << endl;
printpreOrderTraversal ( rootNodePtr );
}
break;
case 8:
if ( rootNodePtr == 0 )
cout << "\n A Arvore esta vazia!!!\n";
else
{
cout << "\n__________________________________Impressao da Arvore em pos-Ordem Tranversal_________________________________________\n" << endl << endl;
printpostOrderTraversal ( rootNodePtr );
}
break;
case 9:
if ( rootNodePtr == 0 )
cout << "\n A altura da Arvore e' 0!!!\n";
else
{
cout << "\n________________Altura da Arvore___________________" << endl << endl;
cout << heightTree ( rootNodePtr );
}
break;
case 10:
if ( rootNodePtr == 0 )
cout << "\n A Arvore esta vazia !!!\n";
else
{
cout << "\n________________ Elemento Apagado_________________" << endl << endl;
// deleteelementspecificTree ( rootNodePtr );
}
break;
case 11:
if ( rootNodePtr == 0 )
cout << "\n A Arvore esta vazia !!!\n";
else
{
cout << "\n_____________________Elemento de compração e Busca _______________" << endl << endl;
searchs_pecific_comparisonsTree ( rootNodePtr );
}
break;
}
} while ( choice != 5 );
return 0;
}
// 1) Para criar uma Árvore _______________________________________________________________________________________________________________________________
TreeNode* createTree()
{
// int d;
// TreeNode *rootNodePtr = new TreeNode();
// return rootNodePtr;
int d;
TreeNode *rootNodePtr = new TreeNode();
cout<<"\n Entrada do primeiro no (no raiz) dos dados = ";
cin>>d;
rootNodePtr -> setData(d);
rootNodePtr -> setLeftPtr(0);
rootNodePtr -> setRightPtr(0);
return rootNodePtr;
}
// 2) ao modo de inserção na nova Árvore____________________________________________________________________________________________________________________
void insertTree ( TreeNode* rNodePtr , int d )
{
if ( ( d < rNodePtr -> getData() ) && ( rNodePtr -> getLeftPtr() == 0 ) )
{ // criar e inserir a esquerda da folha
TreeNode *NewNodePtr = new TreeNode(); // criar um novo elemento da árvore
NewNodePtr -> setData(d);
NewNodePtr -> setLeftPtr(0); // definir 0 à esquerda
NewNodePtr -> setRightPtr (0); // define 0 à direita
rNodePtr -> setLeftPtr ( NewNodePtr );
return;
}
else if ( d < rNodePtr -> getData() )
{
insertTree ( rNodePtr -> getLeftPtr(), d );
}
else if ( ( d > rNodePtr -> getData() ) && ( rNodePtr -> getRightPtr() == 0 ) )
{ // criar e inserir como uma folha de direito
TreeNode *NewNodePtr = new TreeNode(); // criar um novo elemento da árvore
NewNodePtr -> setData(d);
NewNodePtr -> setLeftPtr(0); // define 0 à esquerda
NewNodePtr -> setRightPtr(0); // define 0 à direita
rNodePtr -> setRightPtr ( NewNodePtr );
return;
}
else if ( d > rNodePtr -> getData() )
{
insertTree ( rNodePtr -> getRightPtr(), d );
}
else
cout << "\n O lemento inserido, ja existe na lista" << endl << endl;
}
// 3) para imprimir árvore, em Ordem Transversal_______________________________________________________________________________________________________________
void printinOrderTraversal ( TreeNode* rNodePtr )
{
if ( rNodePtr != 0 ) // A árvore não está vazia
{
printinOrderTraversal ( rNodePtr -> getLeftPtr() );
rNodePtr -> printData();
printinOrderTraversal ( rNodePtr -> getRightPtr() );
}
return;
}
// 6) para imprimir a Árvore em nível________________________________________________________________________________________________________________________
void printTree ( TreeNode* rNodePtr, int totalSpace )
{
if ( rNodePtr == 0 )
return;
else
{
printTree ( rNodePtr -> getRightPtr(), totalSpace+6 );
for ( int i = 1; i < totalSpace; i++ )
cout << " ";
rNodePtr -> printData();
cout << endl;
printTree ( rNodePtr -> getLeftPtr(), totalSpace+6 );
}
}
// 7) para imprimir a Árvore em preOrderTraversal_____________________________________________________________________________________
void printpreOrderTraversal ( TreeNode* rNodePtr )
{
if ( rNodePtr != 0 ) // A árvore não está vazia
{
rNodePtr -> printData();
printpreOrderTraversal( rNodePtr -> getLeftPtr() );//2
printpreOrderTraversal( rNodePtr -> getRightPtr() );//3
}
return;
}
// 8) para imprimir a Árvore em posOrdem Transversal_______________________________________________________________________________________
void printpostOrderTraversal ( TreeNode* rNodePtr )
{
if ( rNodePtr != 0 ) // A árvore não está vazia
{
printpostOrderTraversal ( rNodePtr -> getLeftPtr() );
printpostOrderTraversal ( rNodePtr -> getRightPtr());
rNodePtr -> printData();
}
return;
}
// 9) Para calcular a altura da árvore______________________________________________________________________________________________________
int heightTree ( TreeNode* rNodePtr )
{
if ( rNodePtr == 0 ) // a altura de uma árvore vazia é 0.
return 0;
else if ( rNodePtr -> getLeftPtr() != 0 )
return 1+ ( heightTree ( rNodePtr -> getLeftPtr()));
else if ( rNodePtr -> getRightPtr() != 0 )
return 1+( heightTree ( rNodePtr -> getRightPtr() ));
else
{
return 1+ max (( heightTree ( rNodePtr -> getLeftPtr())),( heightTree (rNodePtr -> getRightPtr() )));
}
}
int max ( int a, int b )
{
if ( a > b )
return a;
else
return b;
}
Aqui entraria o código para fazer a busca e comparar elemento à elemento.