Pagini recente » Cod sursa (job #3180064) | Cod sursa (job #617460) | Cod sursa (job #561579) | Cod sursa (job #1657231) | Cod sursa (job #1322890)
#include<iostream>
#include<fstream>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int max(int a,int b) {if(a>=b) return a; return b;}
struct AVL_Tree
{
int key, h=0;
AVL_Tree *l, *r;
};
AVL_Tree* AVL=NULL;
int inaltime(AVL_Tree *n)
{
int dr,st;
if(n->r==NULL) dr=0;
else dr=n->r->h;
if(n->l==NULL) st=0;
else st=n->l->h;
return 1+max(st,dr);
}
AVL_Tree* rotleft(AVL_Tree *n)
{
AVL_Tree *t = n->l;
n->l = t->r;
t->r = n;
n->h= inaltime(n);
t->h = inaltime(t);
n=t;return t;
}
AVL_Tree* rotright(AVL_Tree *n)
{
AVL_Tree *t = n->r;
n->r = t->l;
t->l = n;
n->h = inaltime(n);
t->h = inaltime(t);
n=t;return t;
}
int echil(AVL_Tree *n)
{
int right,left;
if (n->r==NULL) right=0;
else right=n->r->h;
if (n->l==NULL) left=0;
else left=n->l->h;
return right-left;
}
AVL_Tree* balance(AVL_Tree *n)
{
n->h =inaltime(n);
int k=echil(n);
if (k<0)
{
if (echil(n->l)>0)
n->l = rotright(n->l);
n = rotleft(n);
}
else
if(k>0)
{
if (echil(n->r)<0)
n->r = rotleft(n->r);
n = rotright(n);
}
return n;
}
AVL_Tree* insert(AVL_Tree *n, int k)
{
if (n == NULL)
{
n = new AVL_Tree;
n->key = k;
n->h = 1;
n->l = n->r = NULL;
return n;
}
if (k < n->key)
n->l = insert(n->l, k);
else
n->r = insert(n->r, k);
return balance(n);
}
void afiseaza(AVL_Tree *n)
{
if(n==NULL) return;
afiseaza(n->l);
g<<n->key<<" ";
afiseaza(n->r);
}
int main()
{
long i,p;
long x;
f>>p;
for(i=1;i<=p;i++)
{f>>x;
AVL=insert (AVL,x);}
afiseaza(AVL);
f.close();
g.close();
return 0;
}