Ciao, ho compilato questo programma sugli alberi binari, e mi escono alcuni errori che non capisco: in particolare mi dice "ambiguous call to overloaded function" riferendosi alla ricorsività nella funzione InsAlbero e nella funzione DistruggiAlbero; a cosa può essere dovuto e come posso risolvere?
Grazie
codice:
#include <iostream.h>
#include <stdlib.h>
struct treenode{
int info;
treenode* sx;
treenode* dx;
};
int ContaNodi(treenode*);
treenode* BilanciaAlbero(treenode*);
void CreaArray(treenode*,int,int[]);
treenode* RicavaAlbero(int,int,int[]);
void InsAlbero(treenode*,int);
void DistruggiAlbero(treenode*);
void StampaAlbero(treenode*);
void main()
{
treenode* albero=NULL;
int scelta,n;
char end;
while(scelta!=0)
{
system("cls");
cout<<"\n\t\t\tMENU"
<<"\n\t|1| Crea albero"
<<"\n\t|2| Visualizza albero"
<<"\n\t|0| Esci"
<<"\n\n\t\tOpzione: ";
cin>>scelta;
switch(scelta){
case 1:
while(n!=0)
{
cout<<"\n\tElemento: ";
cin>>n;
InsAlbero(albero,n);
}
BilanciaAlbero(albero);
break;
case 2:
cout<<"\n\n";
StampaAlbero(albero);
cout<<"\n\tPremi un tasto per tornare al menu ";
cin>>end;
break;
}
}
}
void InsAlbero(treenode* &radice,int n)
{
if(radice==NULL)
{
radice=new treenode;
radice->info=n;
radice->sx=NULL;
radice->dx=NULL;
}
else
{
if(n>radice->info)
{
if(radice->dx==NULL)
{
radice->dx=new treenode;
radice->dx->info=n;
radice->dx->dx=NULL;
radice->dx->sx=NULL;
}
else
InsAlbero(radice->dx,n);
}
else if(n<radice->info)
{
if(radice->sx==NULL)
{
radice->sx=new treenode;
radice->sx->info=n;
radice->sx->dx=NULL;
radice->sx->sx=NULL;
}
else
InsAlbero(radice->sx,n);
}
}
}
void BilanciaAlbero(treenode* &radice)
{
int DIM;
DIM = ContaNodi(radice);
int array = new int[DIM];
int i=0;
CreaArray(radice,array,i);
DistruggiAlbero(radice);
int p=1;
int u=DIM;
radice=RicavaAlbero(p,u,array);
}
int ContaNodi(treenode* radice)
{
int cont=0;
if(radice->dx!=NULL)
cont=ContaNodi(radice->dx);
if(radice->sx!=NULL)
cont=ContaNodi(radice->sx);
cont++;
return cont;
}
void CreaArray(treenode* radice,int array[],int &i)
{
if(radice->sx!=NULL)
CreaArray(radice->sx,array,i);
array[i]=radice->info;
i++;
if(radice->dx!=NULL)
CreaArray(radice->dx,array,i);
}
void DistruggiAlbero(treenode* &radice)
{
if(radice!=NULL)
{
if(radice->sx!=NULL)
DistruggiAlbero(radice->sx);
if(radice->dx!=NULL)
DistruggiAlbero(radice->dx);
delete radice;
radice=NULL;
}
}
treenode* RicavaAlbero(int primo, int ultimo, int array[])
{
int mediana;
if(ultimo>=primo)
{
mediana=(primo+ultimo)/2;
treenode* tmp=new treenode;
tmp->info=array[mediana];
tmp->sx=RicavaAlbero(primo,mediana-1,array);
tmp->dx=RicavaAlbero(mediana+1,ultimo,array);
return tmp;
}
return NULL;
}
void StampaAlbero(treenode* radice)
{
if(radice!=NULL)
{
cout<<"\t"<<radice->info;
StampaAlbero(radice->sx);
StampaAlbero(radice->dx);
}
}