Ciao a tutti, sto iniziando ad affrontare più in dettaglio l'approccio mentale e algoritmico per risolvere problemi riguardanti gli alberi Binari ordinati o meno. Vi propongo una traccia di un esercizio, io sono riuscito a fare le prime due funzioni, anche se le ho rese void nell'impotesi che ci potessero essere ripetizioni all'interno dell'albero, non sono riuscito a renderle char.

codice:
Descritte le parentele secondo un albero non ordinato scrivere le funzioni

char Padre
{dato un nome determinare se ha un padre e chi è}

void  Figlio
{dato un nome determinare se ha uno o  due figli e chi sono}

char Nonno  
 {dato un nome determinare chi è il nonno}

char Fratello
{dato un nome determinare se ha un fratello e chi è}
				
char Cugino
{dato un nome determinare se ha uno Cugino e chi è}
Il Mio Codice:

codice:
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <math.h>
#include <time.h> //Genera Numeri Casuali Tutti Diversi
#include <string>

struct Anodo{
             char key[20];
             Anodo *left,*right;
             };

typedef Anodo *PAnodo;


using namespace std;

void CreaAlberoDaFile(PAnodo &);
PAnodo InsertSort(char [],PAnodo );
void InsertSort2( PAnodo &,char [], bool &, bool &, bool &);
int Altezza(PAnodo );
void StampaBST(PAnodo ,int );
void pfileorder(PAnodo );

//Le Funzioni sono Void in quanto In un Albero Binario Non Ordinato Ci Possono
//Essere Ripetizioni
void padre(PAnodo ,char []);
void nonno(PAnodo ,char []);
void figli(PAnodo ,char [], int &);


int main(){
    
    PAnodo A;
    
    CreaAlberoDaFile(A);
    //A=AlberoCasuale(3);
    StampaBST(A,0);
    
    char dad[20];
    
  /*  cout<<"Inserisci Un Nome: ";
    cin>>dad;
    
   // char* son=
    padre(A,dad);
    //cout<<son;
    //system("pause");
    
   // if(son!="0") cout<<"Padre: "<<son<<endl;
   // else cout<<"Padre non trovato"<<endl;
   int nfigli=0;
   cout<<"Inserisci Un Nome: ";
   cin>>dad;
   
   figli(A,dad,nfigli);
   cout<<"\nNumero Figli: "<<nfigli<<endl;*/
   
   cout<<"Inserisci Un Nome: ";
   cin>>dad;
   
   nonno(A,dad);

    cout<<endl;
    
    system("pause");
    return 0;
    
}

void padre(PAnodo A,char Nome[]){
     
     if (A!=NULL){
                 padre(A->right,Nome); 
                 if(stricmp(A->left->key,Nome)==0 ||
                    stricmp(A->right->key,Nome)==0) 
                    cout<<"Padre: "<<A->key<<endl; 
                 padre(A->left,Nome);
                 
     }
     
}

void figli(PAnodo A,char Nome[],int &nfigli){
     
     if (A!=NULL){
                 figli(A->right,Nome,nfigli); 
                 if(stricmp(A->key,Nome)==0){
                 if(A->right!=NULL){
                                     nfigli++;
                                     cout<<"Figlio "<<nfigli<<" : ";
                                     cout<<A->right->key<<endl;
                                     }
                 if(A->left!=NULL){
                                     nfigli++;
                                     cout<<"Figlio "<<nfigli<<" : ";
                                     cout<<A->left->key<<endl;
                                     }
                 }
                                     
                 figli(A->left,Nome,nfigli);
                 
     }
     
}

int Altezza(PAnodo A)  
{ // CALCOLA L’ALTEZZA DELL’ALBERO A
  int Hs, Hd;
  if (A==NULL)
     return -1;
  else   {
     	Hs=Altezza(A->left); Hd=Altezza(A->right);
     	if (Hs > Hd)
        		return ++Hs;
     	else
        		return ++Hd;
 }
}

/*
* Visita Ricorsivamente l'albero e salva i valori dei nodi che si trovano
* al livello specificato
*/


void visita(PAnodo a, int livello, int i, ofstream &outlista) {

// Check Livello
if (i == livello) {
outlista<<a->key<<"\t";
return;
}
// Incrementa contatore livello
i++;
// Visita Nodo Sinistro
if (a->left != NULL)
visita(a->left, livello, i,outlista);
// Visita Nodo Destro
if (a->right != NULL)
visita(a->right, livello, i,outlista);
}


void pfileorder(PAnodo Tree){
     
    char num[20];
    //cout<<"Salva Albero su FILE:"<<endl;
    string NomeLn,NomeOut;
    ifstream filista;
    ofstream outlista;
    NomeOut="alberocar.txt";
    outlista.open(NomeOut.c_str());
    if(!outlista){
        cerr<<"Non si puo' aprire il file!"<<endl;
        system("pause");
    }
    
    for(int k=0;k<=Altezza(Tree);k++)
    visita(Tree,k,0,outlista);
    
    outlista.close();
}


void CreaAlberoDaFile(PAnodo &Tree){
    char num[20];
    cout<<"Crea Albero da FILE:"<<endl;
    Tree=NULL;
    string NomeLn,NomeOut;
    ifstream filista;
    ofstream outlista;
    NomeLn="alberocar.txt";
    filista.open(NomeLn.c_str());
    if(!filista){
        cerr<<"Non si puo' aprire il file!"<<endl;
        system("pause");
    }
   filista>>num;  
   while (!filista.eof()) { 
      bool temp=false;
      bool left=false,right=false;
      InsertSort2( Tree, num, temp,left,right); 
      if (temp==false) cout<<"Nome preesistente ="<<num<<endl;
      else cout<<" Inserito Nome= "<<num<<endl;
      filista>>num;;
      }
      system("pause");
    filista.close();
}

//Essendo non Ordinato ci possono essere ripetizioni
void InsertSort2( PAnodo &A,char m[], bool &inserito, bool &left, bool &right)  
 { //Non Ord

       if(A==NULL)  {
         A=new Anodo;
         strcpy(A->key,m);
         A->left=NULL;
         A->right=NULL;
         inserito=true;
         }          
      else if(stricmp(A->key,m)<0 && !left){
                                       left=true;
                                       right=false;
                                       InsertSort2(A->right,m,inserito,left,right);
                                       
                                       }
      else if(stricmp(A->key,m)>0 && left && !right){
                                       left=false;
                                       right=true;
                                       InsertSort2(A->left,m,inserito,left,right);
                                       
                                       }
      else InsertSort2(A->left,m,inserito,left,right);
}

void StampaBST(PAnodo Tree,int i){
    if(Tree!=NULL){
        StampaBST(Tree->right,i+1);
        for(int j=1;j<=i;j++)
            cout<<"\t\t";
        cout<<Tree->key;
        cout<<endl<<endl<<endl;
        StampaBST(Tree->left,i+1);
    }
}
Grazie a tutti per l'aiuto che mi darete, non riesco ad entrare nell'ottica dell'albero, complice anche il caldo eccessivo di questi giorni ed altro...