Pagini recente » Cod sursa (job #3191863) | Cod sursa (job #722150) | Cod sursa (job #1163442) | Cod sursa (job #102377) | Cod sursa (job #1322431)
#include<stdio.h>
#include<algorithm>
using namespace std;
int nr,val;
struct node
{
int key,h;
struct node *l, *r;
} *R,*nil;
void inaltime(node *n)
{
n->h=1+max(n->l->h, n->r->h);
}
void init()
{
R=nil=(node *) malloc(sizeof(node));
nil->key=nil->h=0;
nil->l=nil->r=NULL;
}
node* rotr(node *n)
{
node *t = n->l;
n->l = t->r;
t->r = n;
inaltime(n);
inaltime(t);
return t;
}
node* rotl(node *n)
{
node *t = n->r;
n->r = t->l;
t->l = n;
inaltime(n);
inaltime(t);
return t;
}
node* balance(node *n)
{
inaltime(n);
if (n->l->h > n->r->h + 1)
{
if (n->l->r->h > n->l->l->h)
n->l = rotl(n->l);
n = rotr(n);
}
else
if (n->r->h > n->l->h + 1)
{
if (n->r->l->h > n->r->r->h)
n->r = rotr(n->r);
n = rotl(n);
}
return n;
}
node* baga (node *n, int k)
{
if(n==nil)
{
n = (node*) malloc(sizeof(node));
n->key=k;
n->h=1;
n->l=n->r=nil;
return n;
}
if(k< n->key) n->l = baga(n->l, k);
else n->r = baga(n->r, k);
return balance(n);
}
node *sterge (node *n, int ch)
{
node *t;
if(n == nil) return n;
if(n->key == ch)
{
if(n->l==nil || n->r==nil)
{
t= n->l==nil ? n->r : n->l;
free(n);
return t;
}
else
{
for(t = n->r; t->l!=nil; t=t->l)
{
n->key=t->key;
n->r=sterge (n->r, t->key);
}
return balance(n);
}
}
if(ch < n->key)
n->l = sterge(n->l, ch);
else n->r = sterge(n->r, ch);
return balance(n);
}
int cauta(node *n, int ch)
{
if (n==nil) return 0;
if(n->key == ch) return 1;
if(ch < n->key)
return cauta (n->l, ch);
else return cauta(n->r, ch);
}
void avlsort(node *n)
{
if(n==nil) return;
avlsort(n->l);
printf("%d ",n->key);
avlsort(n->r);
}
void solve()
{
scanf("%d",&nr);
init();
for(int i=1;i<=nr;++i)
{
scanf("%d",&val);
R=baga(R,val);
}
avlsort(R);
}
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
solve();
}