Cod sursa(job #1283105)

Utilizator deresurobertoFMI - Deresu Roberto deresuroberto Data 5 decembrie 2014 02:23:29
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 3.66 kb
#include<fstream>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,tip,value;

struct Node
{
    int value;
    struct Node *left, *right;
	int height;
} *Root, *NIL;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

void init()
{
    Root = NIL = (Node *) malloc(sizeof(Node));

    NIL->value = NIL->height = 0;
    NIL->left = NIL->right = NULL;
}

void SVD(Node *node)
{
    if(node->left != NIL)
        SVD(node->left);

    fout<<node->value<<" ";

    if(node->right != NIL)
        SVD(node->right);
}

Node* rotright(Node *node)
{
    Node *t = node->left;

    node->left = t->right;
    t->right = node;

    node->height = 1 + max(node->left->height, node->right->height);
    t->height = 1 + max(t->left->height, t->right->height);

    return t;
}

Node* rotleft(Node *node)
{
    Node *t = node->right;

    node->right = t->left;
    t->left = node;

    node->height = 1 + max(node->left->height, node->right->height);
    t->height = 1 + max(t->left->height, t->right->height);

    return t;
}

Node* balance(Node *node)
{
    node->height = 1 + max(node->left->height, node->right->height);

    if(node->left->height > node->right->height + 1)
    {
        if(node->left->right->height > node->left->left->height)
            node->left = rotleft(node->left);

        node = rotright(node);
    }
    else
    if(node->right->height > node->left->height + 1)
    {
        if(node->right->left->height > node->right->right->height)
            node->right = rotright(node->right);

        node = rotleft(node);
    }

    return node;
}

Node* insert(Node *node, int value)
{
    if(node == NIL)
    {
        node = (Node *) malloc(sizeof(Node));

        node->value = value;
        node->height = 1;
        node->left = node->right = NIL;

        return node;
    }
    if(value < node->value)
        node->left = insert(node->left, value);
    else
        node->right = insert(node->right, value);

    return balance(node);
}

Node* erase(Node *node, int value)
{
    Node *t;

    if(node == NIL) return node;

    if(node->value == value)
    {
        if(node->left == NIL || node->right == NIL)
        {
            if(node->left == NIL) t = node->right;
                             else t = node->left;
            free(node);
            return t;
        }
        else
        {
            t = node->left;
            while(t->right != NIL) t = t->right;

            node->value = t->value;
            node->left = erase(node->left, t->value);

            return balance(node);
        }
    }

    if(value < node->value)
        node->left = erase(node->left, value);
    else
        node->right = erase(node->right, value);

    return balance(node);
}

int search(Node *node, int value)
{
    if(node == NIL) return 0;
    if(node->value == value) return 1;

    if(value < node->value)
        return search(node->left, value);
    else
        return search(node->right, value);
}

int main()
{
    init();

    fin>>n;

    for(int i=1;i<=n;i++)
    {
        tip = 1;

        if(tip != 4) fin>>value;

        if(tip == 1)
            Root = insert(Root,value); // insereaza valoare

        if(tip == 2)
            Root = erase(Root,value); // sterge valoare

        if(tip == 3)
        {
            if(search(Root,value))fout<<"Da"<<'\n'; // cauta vloare
                             else fout<<"Nu"<<'\n';
        }

        if(tip == 4)
        {
            SVD(Root);  // afiseaza valori sortate
            fout<<'\n';
        }
    }

    SVD(Root);

    return 0;
}