Cod sursa(job #1320520)

Utilizator YusukeFMI Mares Medar Razvan Yusuke Data 18 ianuarie 2015 00:58:14
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.55 kb
//Mares Medar Razvan - Grupa 141
//Algoritm AVL
#include <iostream>
#include <cctype>
#include <stdlib.h>
#include <fstream>
using namespace std;
int n,i,a;
ifstream f("algsort.in");
ofstream g("algsort.out");
struct node{
    int inf;
    node *left,*right;
    int height;
    };
typedef struct node *nodeptr;
void insert(int,nodeptr &);
void del(int, nodeptr &);
int deletemin(nodeptr &);
void find(int,nodeptr &);
nodeptr findmin(nodeptr);
nodeptr findmax(nodeptr);
void makeempty(nodeptr &);
void copy(nodeptr &,nodeptr &);
nodeptr nodecopy(nodeptr &);
void rsd(nodeptr);
void srd(nodeptr);
void sdr(nodeptr);
int bsheight(nodeptr);
nodeptr srl(nodeptr &);
nodeptr drl(nodeptr &);
nodeptr srr(nodeptr &);
nodeptr drr(nodeptr &);
int max(int,int);
int nonodes(nodeptr);
void insert(int x,nodeptr &p){
    if (p == NULL){
        p = new node;
        p->inf = x;
        p->left=NULL;
        p->right = NULL;
        p->height=0;
        if (p==NULL)
            cout<<"Nu mai este spatiu"<<endl;
    }
    else{
        if (x<p->inf){
            insert(x,p->left);
            if ((bsheight(p->left) - bsheight(p->right))==2)
                if (x < p->left->inf)
                    p=srl(p);
                else
                    p = drl(p);
            }
        else if (x>p->inf){
            insert(x,p->right);
            if ((bsheight(p->right)-bsheight(p->left))==2)
                if (x > p->right->inf)
                    p=srr(p);
                else
                    p = drr(p);
            }
        else
            cout<<"Elementul exista deja."<<endl;
    }
    int m,n,d;
    m=bsheight(p->left);
    n=bsheight(p->right);
    d=max(m,n);
    p->height = d + 1;
}
void copy(nodeptr &p,nodeptr &p1){
    makeempty(p1);
    p1 = nodecopy(p);
}
void makeempty(nodeptr &p){
    nodeptr d;
    if (p != NULL){
        makeempty(p->left);
        makeempty(p->right);
        d=p;
        free(d);
        p=NULL;
    }
}
nodeptr nodecopy(nodeptr &p){
    nodeptr temp;
    if (p==NULL)
        return p;
    else{
        temp = new node;
        temp->inf= p->inf;
        temp->left = nodecopy(p->left);
        temp->right = nodecopy(p->right);
        return temp;
    }
}
void srd(nodeptr p){
    if (p!=NULL){
    srd(p->left);
    g<<p->inf<<" ";
    srd(p->right);
    }
}
int max(int value1, int value2){
    return ((value1 > value2) ? value1 : value2);
}
int bsheight(nodeptr p){
    int t;
    if (p == NULL)
        return -1;
    else{
        t = p->height;
        return t;
        }
}
nodeptr srl(nodeptr &p1){
    nodeptr p2;
    p2 = p1->left;
    p1->left = p2->right;
    p2->right = p1;
    p1->height = max(bsheight(p1->left),bsheight(p1->right)) + 1;
    p2->height = max(bsheight(p2->left),p1->height) + 1;
    return p2;
}
nodeptr srr(nodeptr &p1){
    nodeptr p2;
    p2 = p1->right;
    p1->right = p2->left;
    p2->left = p1;
    p1->height = max(bsheight(p1->left),bsheight(p1->right)) + 1;
    p2->height = max(p1->height,bsheight(p2->right)) + 1;
    return p2;
}
nodeptr drl(nodeptr &p1){
    p1->left=srr(p1->left);
    return srl(p1);
}
nodeptr drr(nodeptr &p1){
    p1->right = srl(p1->right);
    return srr(p1);
}
int nonodes(nodeptr p){
    int count=0;
    if (p!=NULL){
        nonodes(p->left);
        nonodes(p->right);
        count++;
    }
    return count;
}
int main(){
    nodeptr root;
    root=NULL;
    f>>n;
    for(i=1;i<=n;i++){
        f>>a;
        insert(a,root);
    }
    srd(root);
}