codice:
#include <cstdlib>
#include <iostream>
#include <fstream>
#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 );
PAnodo Insert(char [], PAnodo , PAnodo ); //Generazione Alberi Casuali NN Ord
PAnodo AlberoCasuale(int ); //Generazione Alberi Casuali NN Ord
//Le Funzioni sono Void in quanto In un Albero Binario Non Ordinato Ci Possono
//Essere Ripetizioni
void VisitaPadre(PAnodo ,int ,int ,char [],PAnodo &);
void VisitaFigli(PAnodo ,int ,int ,char [],PAnodo &,PAnodo &);
void VisitaFratello(PAnodo ,int ,int ,char [],PAnodo &);
int main(){
PAnodo A,Padre=NULL,Figlio=NULL,Figlio1=NULL,Nonno=NULL,Fratello=NULL;
PAnodo Padre1=NULL;
CreaAlberoDaFile(A);
//A=AlberoCasuale(4);
StampaBST(A,0);
system("pause");
char dad[20];
bool found=false;
cout<<"Inserisci Un Nome: ";
cin>>dad;
//Se senza Ripetizioni mettere un while con un controllo che appena stampa
//il padre trovato si ferma
//Se ci sono ripetizioni ritorna l'ultimo trovato, per visualizzarli tutti
//Inserire stampa all'interno delle function
//Le Procedure si possono rendere comodamente funzioni inserendo i seguenti
//cicli for all'intero di una funziona char* con un return, ma in questo
//Si esclude totalmente la possibilità di presenza di ripetizioni
for(int i=0;i<Altezza(A);i++){
VisitaPadre(A,0,i,dad,Padre);
if(Padre!=NULL){ found=true; cout<<"Padre: "<<Padre->key<<endl;
Padre=NULL;}
}
if (Padre==NULL && !found) cout<<"Nessun Padre"<<endl;
cout<<endl;
found=false;
cout<<"Inserisci Un Nome: ";
cin>>dad;
for(int i=0;i<Altezza(A);i++){
VisitaFigli(A,0,i,dad,Figlio,Figlio1);
if(Figlio!=NULL){ found=true; cout<<"Figlio: "<<Figlio->key<<endl;
Figlio=NULL;}
if(Figlio1!=NULL){ found=true; cout<<"Figlio: "<<Figlio1->key<<endl;
Figlio1=NULL;}
}
if (Figlio==NULL && Figlio1==NULL && !found) cout<<"Nessun Figlio"<<endl;
cout<<endl;
found=false;
cout<<"Inserisci Un Nome: ";
cin>>dad;
//Non Funziona se ci sono ripetizioni
//Ad esempio due nomi uguali al livello 2 e 3
//O meglio ritorna il primo risultato che incontra
for(int i=0;i<Altezza(A);i++){
VisitaPadre(A,0,i,dad,Padre);
if(Padre!=NULL){
strcpy(Padre->key,dad);
VisitaPadre(A,0,i-1,dad,Padre1);
}
if(Padre1!=NULL && !found &&
stricmp(Padre1->key,dad)!=0)
{ found=true; cout<<"Nonno: "<<Padre1->key<<endl;
Padre=NULL;}
else Padre1==NULL;
}
if (Nonno==NULL && !found) cout<<"Nessun Nonno"<<endl;
found=false;
cout<<"Inserisci Un Nome: ";
cin>>dad;
for(int i=0;i<Altezza(A);i++){
VisitaFratello(A,0,i,dad,Fratello);
if(Fratello!=NULL){ found=true; cout<<"Fratello: "<<Fratello->key<<endl;
Fratello=NULL;}
}
if (Fratello==NULL && !found) cout<<"Nessun Fratello"<<endl;
cout<<endl;
//Albero Senza Ripetizioni
Figlio=NULL;
Fratello=NULL;
Figlio1=NULL;
found=false;
cout<<"Inserisci Un Nome: ";
cin>>dad;
char dad1[20];
strcpy(dad1,dad);
cout<<"\n"<<dad1<<endl;
//system("pause");
for(int i=0;i<Altezza(A);i++){
VisitaPadre(A,0,i,dad,Padre);
cout<<i<<endl;
//system("pause");
if(Padre!=NULL && i!=0){
strcpy(dad,Padre->key);
cout<<Padre->key<<endl;system("pause");
VisitaPadre(A,0,i-1,dad,Padre1);
}
else if(Padre!=NULL && i==0){
if(Padre->left!=NULL &&
stricmp(Padre->left->key,dad1)!=0){
cout<<"Cugino: "<<Padre->left->key<<endl;
found=true;
}
if(Padre->right!=NULL &&
stricmp(Padre->right->key,dad1)!=0){
cout<<"Cugino: "<<Padre->right->key<<endl;
found=true;
}
}
}
if(Padre1!=NULL) cout<<Padre1->key<<endl;
system("pause");
if(Padre1!=NULL && !found)
{
if(Padre1->left!=NULL && Padre1->left->left!=NULL &&
stricmp(Padre1->left->left->key,dad1)!=0){
cout<<"Cugino: "<<Padre1->left->left->key<<endl;
found=true;
}
if(Padre1->left!=NULL && Padre1->left->right!=NULL &&
stricmp(Padre1->left->right->key,dad1)!=0){
cout<<"Cugino: "<<Padre1->left->right->key<<endl;
found=true;
}
if(Padre1->right!=NULL && Padre1->right->left!=NULL &&
stricmp(Padre1->right->left->key,dad1)!=0){
cout<<"Cugino: "<<Padre1->right->left->key<<endl;
found=true;
}
if(Padre1->right!=NULL && Padre1->right->right!=NULL &&
stricmp(Padre1->right->right->key,dad1)!=0){
cout<<"Cugino: "<<Padre1->right->right->key<<endl;
found=true;
}
Padre=NULL;
}
if (!found) cout<<"Nessun Cugino"<<endl;
system("pause");
return 0;
}
void VisitaFratello(PAnodo a,int i,int livello,char Nome[],PAnodo &Fratello){
// Check Livello
if (i == livello) {
if(stricmp(a->left->key,Nome)==0 && a->right!=NULL)
Fratello=a->right;
else if(stricmp(a->right->key,Nome)==0 && a->left!=NULL)
Fratello=a->left;
//cout<<Padre->key;
//system("pause");
}
// Incrementa contatore livello
i++;
// Visita Nodo Sinistro
if (a->left != NULL)
VisitaFratello(a->left, i,livello,Nome,Fratello);
// Visita Nodo Destro
if (a->right != NULL)
VisitaFratello(a->right, i,livello,Nome,Fratello);
}
void VisitaFigli(PAnodo a,int i,int livello,char Nome[],PAnodo &Figlio, PAnodo &Figlio1){
// Check Livello
if (i == livello) {
if(stricmp(a->key,Nome)==0){
if(a->left!=NULL) {Figlio=a->left; //cout<<Figlio->key<<endl;}
if(a->right!=NULL) {Figlio1=a->right; //cout<<Figlio1->key<<endl;}
}
//cout<<Padre->key;
// system("pause");
}
// Incrementa contatore livello
i++;
// Visita Nodo Sinistro
if (a->left != NULL)
VisitaFigli(a->left, i,livello,Nome,Figlio,Figlio1);
// Visita Nodo Destro
if (a->right != NULL)
VisitaFigli(a->right, i,livello,Nome,Figlio,Figlio1);
}}}
void VisitaPadre(PAnodo a,int i,int livello,char Nome[],PAnodo &Padre){
// Check Livello
if (i == livello) {
if(stricmp(a->left->key,Nome)==0 ||
stricmp(a->right->key,Nome)==0)
Padre=a;
//cout<<Padre->key;
//system("pause");
}
// Incrementa contatore livello
i++;
// Visita Nodo Sinistro
if (a->left != NULL)
VisitaPadre(a->left, i,livello,Nome,Padre);
// Visita Nodo Destro
if (a->right != NULL)
VisitaPadre(a->right, i,livello,Nome,Padre);
}
PAnodo Insert(char info1[], PAnodo As, PAnodo Ad) {
// PER INSERIRE UNA FOGLIA SI CHIAMA CON Insert(Numero,NULL,NULL)
PAnodo A2;
A2= new Anodo;
strcpy(A2->key,info1);
A2->left=As;
A2->right=Ad;
return A2;
}
PAnodo AlberoCasuale(int n) {
char *v[10]={
"Marco",
"Giulio",
"Rocco",
"Vincenzo",
"Andrea",
"Giulietta",
"Alfa",
"Romeo",
"Domenico",
"Francesco"
};
if (n==1)
return Insert(v[rand() % 10], NULL, NULL);
else
return Insert(v[rand() % 10], AlberoCasuale(n-1), AlberoCasuale(n-1));
}
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();
}
Continua...