Cod sursa(job #1322431)

Utilizator priestnoobFMI - Dan Nema priestnoob Data 20 ianuarie 2015 00:55:13
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#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();
}