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);
	}
}