Cod sursa(job #1322890)

Utilizator alinmocanu95FMI Alin Mocanu alinmocanu95 Data 20 ianuarie 2015 14:53:10
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#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;
}