Cod sursa(job #1557187)

Utilizator rangerChihai Mihai ranger Data 26 decembrie 2015 23:03:16
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 3.2 kb
# include <bits/stdc++.h>

using namespace std;
# define endl '\n'

struct Node {
    int key;

    Node * left, * right;
    Node(int v) : key(v), left(NULL), right(NULL) {};
    Node() : left(NULL), right(NULL) {};
};

Node * root ;

int Cauta(int key)
{
    Node * curent = root;
    while (curent != NULL) {
        if (curent->key == key) return 1;
        if (key < curent->key)
            curent = curent->left;
        else curent = curent->right;
    }
    return 0;
}

void Insereaza(int key)
{
    if (Cauta(key)) return;

    if (root == NULL) root = new Node(key);
    else {
        Node * curent = root;
        while(true)
        {
            if (key < curent->key) {
                if (curent->left == NULL) { curent->left = new Node(key);  return; }
                    else curent = curent->left;
            } else {
                if (curent->right == NULL) { curent->right = new Node(key); return; }
                    else curent = curent->right;
            }
        }
    }
}

Node* getParent(Node * node)
{
    if (node == root) return NULL;
    Node * curent = root;
    while (1)
    {
        if (node->key < curent->key) {
            if (curent->left->key  == node->key) return curent;
            else curent = curent->left;
        } else {
            if (curent->right->key == node->key) return curent;
            else curent = curent->right;
        }
    }
}

void Sterge(int key)
{
    if (!Cauta(key)) return;

    Node * curent = root;
    while (curent != NULL) {
        if (key < curent->key) curent = curent->left;
        else if (key > curent->key) curent = curent->right;
        else {
            if (curent->left == NULL && curent->right == NULL)  {
                Node * parent = getParent(curent);
                if (parent!= NULL) {
                    if (parent->left == curent) parent->left = NULL; else parent->right = NULL;
                }
                return;
            }
            if (curent->left == NULL) {
                Node * parent = getParent(curent);
                if (parent != NULL) {
                    if (parent->left == curent) parent->left = curent->right; else parent->right = curent->right;
                }
                return;
            }
            if (curent->right == NULL) {
                Node * parent = getParent(curent);
                if (parent != NULL) {
                    if (parent->left == curent) parent->left = curent->left; else parent->right = curent->left;
                }
                return;
            }

            Node * ncurent = curent->left;
            while (ncurent->right != NULL) ncurent = ncurent->right;
            int tmp = ncurent->key;
            Sterge(tmp);
            curent->key = tmp;
        }
    }
}

int main()
{
  freopen("hashuri.in","r",stdin);
  freopen("hashuri.out","w",stdout);


        int type ; int nrOp, key;
        cin >> nrOp;

        while (nrOp--)
        {
                cin >> type >> key;
                if (type == 1) Insereaza(key);
                if (type == 3) cout << Cauta(key) << endl;
                if (type == 2) Sterge(key);
        }

    return 0;
}