Anteprima
Vedrai una selezione di 3 pagine su 10
Programma C++: Albero (2) Pag. 1 Programma C++: Albero (2) Pag. 2
Anteprima di 3 pagg. su 10.
Scarica il documento per vederlo tutto.
Programma C++: Albero (2) Pag. 6
1 su 10
Disdici quando vuoi 162x117
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Sintesi
Albero utilizando le classi e template programma complesso con più utilizzi.
Estratto del documento

#include <iostream.h>

#include <stdlib.h>

typedef struct nodo

{ int x;

struct nodo *ps;

struct nodo *pd;

}nodo;

class albero

{

int cancella_min(nodo* &s);

void distr(nodo* &p);

void print(nodo *p);

void print1(nodo *p);

void print2(nodo *p);

void copy(nodo* &n,nodo* v);

void ribalta(nodo* &n,nodo* &v);

void contf(nodo* &p,int &x);

void contn(nodo* &p,int &n);

int contaprof(nodo* p);

void bilforte(nodo* s,int &i);

void bilavl(nodo* s,int &i);

void verord(nodo *s,int &i);

public:

void cancella_nodo(nodo* &p,int x);

void cambia_radice(nodo* &t,nodo* &p);

int contafoglie();

int contanodi();

int contaprofondita();

void operator==(const albero ab);

albero operator=(const albero ab);

albero operator-();

nodo *first;

albero();

void verificaordine();

void verificaavl();

void conf_strutt(nodo* p,nodo* q,int & ris);

void insert(nodo* &p,int y);

void insert1(nodo* &p,int y);

void verbilforte();

~albero();

int max(nodo *s);

int min(nodo *s);

albero(const albero &al);

void stampa();

void push(int n);

friend albero operator+(int y,albero op1);

}; �

//metodo privato per verificare se l'albero bilanciato forte

void albero::bilforte(nodo *s,int &i)

{int nodi_sx=0,nodi_dx=0;

if (s!=NULL)

{contn(s->ps,nodi_sx);

contn(s->pd,nodi_dx);

if (abs(nodi_sx-nodi_dx) <= 1)

{i=1;

bilforte(s->ps,i);

bilforte(s->pd,i);

}

else {i=0;

}

}

}; �

//metodo pubblico per verificare se un albero bilanciato forte

void albero :: verbilforte()

{int a=0;

bilforte(first,a);

if(a==1) �

{cout<<"\n l'albero bilanciato forte!"<<endl;

}

else �

{cout<<"\n l'albero non bilanciato forte!"<<endl;

}

};

//cancella_nodo sostituisce il nodo da cancellare con il minimo del sottoalbero

alla destra del nodo

//cancella_min trova questo minimo; in generale cancella_min trova il minimo in

un albero

int albero::cancella_min (nodo* &p)

{ if (p->ps) cancella_min (p->ps);

else

{ nodo* q; //la funzione cerca il nodo + a sinistra

nell'albero senza figlio sx,

q=p; //lo sostituisce con il suo figlio destro,

p=p->pd; //restituendo il valore del nodo cancellato

return q->x;

}

}

void albero::cancella_nodo (nodo* &p,int x)

{ if (p)

{ if (x<p->x) cancella_nodo (p->ps,x);

if (x>p->x) cancella_nodo (p->pd,x);

if (x==p->x)

{ if (p->ps==NULL) p=p->pd; //in questa riga rientra il caso della foglia

else

{ if (p->pd==NULL) p=p->ps;

else

{ p->x=cancella_min(p->pd); //il nodo ha entrambi i figli

}

}

}

}

}

albero operator+(int y,albero op1)

{ albero temp(op1);

temp.insert(temp.first,y);

return(temp);

}

void albero::bilavl(nodo* s,int &i)

{

int profsx=0,profdx=0;

if(s!=NULL)

{

profsx=contaprof(s->ps);

profdx=contaprof(s->pd);

if((abs(profsx-profdx))<=1)

{ i=1;

bilavl(s->ps,i);

bilavl(s->pd,i);

}

else i=0;

}

};

void albero:: verificaavl()

{int i;

bilavl(first,i);

if(i==1) cout<<"Albero bilanciato avl "<<endl;

else cout<<"Albero non bilanciato avl "<<endl;

};

void albero::verord(nodo *s,int &i)

{ if(s!=NULL)

{ if( s->x>max(s->ps) && s->x<min(s->pd) )

{

i=1;

verord(s->ps,i);

verord(s->pd,i);

}

else i=0;

}

};

void albero::verificaordine()

{

int i;

verord(first,i); �

if(i==1) cout<<"L'albero ordinato "<<endl;

else cout<<"L'albero non ordinato "<<endl;

};

int albero::max(nodo *s)

{

if(s!=NULL)

{ int massimo,temp;

massimo=s->x;

temp=max(s->ps);

if(temp>massimo) massimo=temp;

temp=max(s->pd);

if(temp>massimo) massimo=temp;

return massimo;

}

else return(-1000);

};

int albero::min(nodo *s)

{

if(s!=NULL)

{ int minimo,temp;

minimo=s->x;

temp=min(s->ps);

if(temp<minimo) minimo=temp;

temp=min(s->pd);

if(temp<minimo) minimo=temp;

return minimo;

}

else return(1000);

}

albero albero:: operator=(const albero ab)

{

if(ab.first!=NULL)

{ distr(first);

copy(first,ab.first);

return *this;

}

else {

first=NULL;

return *this;

}

};

void albero::operator==(const albero ab)

{ int ris=0;

conf_strutt(first,ab.first,ris);

if(ris) cout<<"Gli alberi sono strutturalmente identici.";

else cout<<"Gli alberi non sono strutturalmente identici.";

};

void albero::conf_strutt(nodo* p,nodo* q,int &ris)

{ if(p==NULL && q==NULL) ris=1;

else

{ if (p!=NULL && q!=NULL)

{ conf_strutt(p->ps,q->ps,ris);

conf_strutt(p->pd,q->pd,ris);

}

else ris=0;

}

};

int albero::contaprofondita()

{ return (contaprof(first)-1);

};

int albero::contaprof(nodo* p)

{ int als,ald;

if (p!=NULL)

{ als=1+contaprof(p->ps);

ald=1+contaprof(p->pd);

if (als>=ald) return als;

else return ald;

}

else return 0;

};

int albero::contanodi()

{

int x=0;

contn(first,x);

return x;

};

void albero::contn(nodo* &p,int &x)

{

if(p!=NULL)

{ x++;

contn(p->ps,x);

contn(p->pd,x);

}

};

int albero::contafoglie()

{ int x=0;

contf(first,x);

return x;

};

void albero::contf(nodo* &p,int &x)

{ if(p!=NULL)

{ if (p->ps==NULL && p->pd==NULL) x++;

contf(p->ps,x);

contf(p->pd,x);

}

};

albero albero::operator-()

{ albero temp;

ribalta(temp.first,first);

return temp;

};

void albero::ribalta(nodo* &n,nodo* &v)

{ if(v!=NULL)

{ n=new nodo;

n->x=v->x;

ribalta(n->ps,v->pd);

ribalta(n->pd,v->ps);

}

};

void albero::insert(nodo* &p,int y)

{

if(p==NULL)

{ p=new nodo;

p->x=y;

p->ps=NULL;

p->pd=NULL;

}

else { if(y<p->x) insert(p->ps,y);

else insert(p->pd,y);

}

};

void albero::insert1(nodo* &p,int y)

{ int z;

if(p==NULL)

{ p=new nodo;

p->x=y;

p->ps=NULL;

p->pd=NULL;

}

else {

z=y/2;

if(y==(z*2)) insert1(p->ps,y);

else insert1(p->pd,y);

}

};

albero::albero(const albero &al)

{

if(al.first!=NULL)

copy(first,al.first);

else first=NULL;

};

void albero::copy(nodo* &n,nodo* v)

{

if(v!=NULL)

{

n=new nodo;

n->x=v->x;

copy(n->ps,v->ps);

copy(n->pd,v->pd);

}

else n=NULL;

};

albero::albero()

{ first=new nodo;

first=NULL;

cout<<"Albero inizializzato!!!"<<endl;

};

albero::~albero()

{ distr(first);

cout<<"Albero distrutto "<<endl;

};

void albero::distr(nodo* &p)

{ if(p)

{

distr(p->ps);

distr(p->pd);

delete p;

}

};

void albero::stampa()

{

int x;

cout<<"Inserisci il metodo di visita dell'albero: "<<endl;

cout<<"Visita in pre-ordine 1"<<endl;

cout<<"Visita in in-ordine 2"<<endl;

cout<<"Visita in post-ordine 3"<<endl;

cin>>x;

cout<<"STAMPA DELL'ALBERO "<<endl;

if (x==1) print(first);

if (x==2) print1(first);

if (x==3) print2(first);

};

void albero::print(nodo* p)

Dettagli
Publisher
10 pagine
88 download