Pagini recente » Cod sursa (job #2853082) | Cod sursa (job #51395) | Cod sursa (job #427708) | Cod sursa (job #1853389) | Cod sursa (job #1557187)
# 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;
}