Sunteți pe pagina 1din 4

#include <iostream>

using namespace std;


struct arb{
int info;
arb *st,*dr;
int ech;
};
void drum_max(arb* rad, int &max,
{
if(rad != NULL)
{
drum_max(rad->dr,
if (rad->st==NULL
max=lung;
drum_max(rad->st,
}
}

int lung)

max, lung+1);
&& rad->dr==NULL && max>lung)
max, lung+1);

void calc_echi(arb *r)


{
int hleft,hright;
hleft=1;
hright=1;
if (r->st!=NULL)
drum_max(r->st,hleft,1);
else hleft=0;
if(r->dr!=NULL)
drum_max(r->dr,hright,1);
else hright=0;
}
arb* rot_s_dr(arb*r)
{
arb* q;
q=r->st;
r->st=q->dr;
calc_echi(r);
calc_echi(q);
q=q;
return r;
}
arb* rot_s_st(arb* r)
{
arb* q;
q=r->dr;
r->dr=q->st;
calc_echi(r);
calc_echi(q);
q=q;
return r;
}
arb* rot_d_dr(arb* r)
{
r->st=rot_s_st(r->st);

r=rot_s_dr(r);
return r;
}
arb* rot_d_st(arb* r)
{
r->dr=rot_s_dr(r->dr);
r=rot_s_st(r);
return r;
}
arb* echilibrare(arb* r)
{
arb* w;
calc_echi(r);
if(r->ech==-2)
{
w=r->st;
if(w->ech==1)
r=rot_d_dr(r);
else r=rot_d_st(r);
}
else
if(r->ech==2)
{
w=r->dr;
if(w->ech==-1)
r=rot_d_st(r);
else r=rot_d_dr(r);
}
return r;
}
arb* insereaza(arb* r, int x)
{
if(r==NULL)
{
r=new arb;
r->info=x;
r->dr=NULL;
r->st=NULL;
r->ech=0;
return r;
}
else
if (x<r->info)
r->st=insereaza(r->st,x);
else
if (x>r->info)
r->dr=insereaza(r->dr,x);
else cout<<"nu exista ceva";
r=echilibrare(r);
return r;
}
arb* stergere(arb* r, int x)
{
arb* q, *p, *w;
if(r!=NULL)
if(x<r->info)

r->st=stergere(r->st,x);
else
if(x>r->info)
r->dr=stergere(r->dr,x);
else
{
q=r;
if(q->dr==NULL)
r=q->st;
else
if(q->st==NULL)
r=q->dr;
else
{
w=q->st;
p=q;
if(w->dr!=NULL)
{
while(w->dr!=NULL)
{
p=w;
w=w->dr;
}
r->info=w->info;
q=w;
p->dr=w->st;
p=r->st;
w=w->st;
if(p!=NULL)
while(p!=w && p!
=NULL)
{
p=echili
brare(p);
p=p->dr;
}
}
else
{
r->info=w->info;
r->st=w->st;
q=w;
}
}
delete(q);
}
if(r!=NULL)
r=echilibrare(r);
return r;
}
void blanc(int n)
{
for (int i=0; i<n; i++)
{
putchar(' ');
}
}

void afisare(int n, int f, int k, int vb, int *vn)


{
blanc(4);
if (n)
{
for (int i=1; i<n; i++)
{
if (vn[i]) putchar(' ');
else putchar(179); // semnul |
blanc(4);
}
if (f) putchar(195); //semnul t intors
else putchar(192); //semnul L
for (int i=0; i<4; i++) putchar(196); // liniuta }
if (vb) printf("%d\n",k);
else printf(".\n");
}
void af_niv(arb *r, int n=0)
{
int vn[50], f=1;
if (r)
{
afisare(n, f, r->info, 1, vn);
if (r->st || r->dr)
{
f=1;
vn[n+1] = 0;
af_niv(r->st, n+1);
}
if (r->st || r->dr)
{
f=0;
vn[n+1] = 1;
af_niv(r->dr, n+1);
}
}
else afisare(n, f, 10, 0, vn);
}

void main()
{
arb* r;
int x,n=0;
cout<<"NOD: "; cin>>x; cout<<endl;
while(x!=-1)
{
r=insereaza(r,x);
af_niv(r,n);
cout<<"NOD: ";cin>>x; cout<<endl;
}
}

S-ar putea să vă placă și