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...