Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cassert>
- #include <cstdlib>
- #include <cstring>
- #include <iostream>
- using namespace std;
- int k;
- struct node
- {
- node *left, *right, *par;
- int key;
- node(int k, node * a = 0, node * b = 0, node *c = 0): key(k), left(a), right(b), par(c){}
- };
- class tree
- {
- node * root;
- void _add(node *cur, int key)
- {
- if (!root){
- root = new node(key); return;}
- if (cur->key > key)
- if (!cur->left)
- cur->left = new node(key, 0, 0, cur);
- else _add(cur->left, key);
- else
- if (cur->key < key)
- if (!cur->right)
- cur->right = new node(key, 0, 0, cur);
- else _add(cur->right, key);
- }
- void _remove(node *cur, int key)
- {
- if (!cur) return;
- if (cur->key < key)
- _remove(cur->right, key);
- else if (cur->key > key)
- _remove(cur->left, key);
- else
- {
- routine: if (!cur->left && !cur->right)
- {
- if (cur->par->left == cur)
- cur->par->left = 0, delete cur;
- else
- cur->par->right = 0, delete cur;
- }
- else if (cur->left && cur->right)
- {
- node *temp = cur->left;
- while (temp->right)
- temp = temp->right;
- swap(cur->key, temp->key);
- cur = temp;
- goto routine;
- }
- else
- {
- int anc = 0;
- if (cur->left)
- anc = 1;
- if (anc)
- if (cur->par)
- if (cur->par->left == cur)
- cur->par->left = cur->left, cur->left->par = cur->par, delete cur;
- else
- cur->par->right = cur->left, cur->left->par = cur->par, delete cur;
- else
- {
- node * temp = root;
- root = root->left;
- delete temp;
- }
- else
- if (cur->par)
- if (cur->par->left == cur)
- cur->par->left = cur->right, cur->right->par = cur->par, delete cur;
- else
- cur->par->right = cur->right, cur->right->par = cur->par, delete cur;
- else
- {
- node * temp = root;
- root = root->right;
- delete temp;
- }
- }
- }
- }
- void _print(node * cur)
- {
- if (cur)
- {
- printf("%d\n", cur->key);
- _print(cur->left);
- _print(cur->right);
- }
- }
- public:
- tree()
- {
- root = 0;
- }
- tree(int s)
- {
- root = new node(s);
- }
- void add(int key)
- {
- _add(root, key);
- }
- void remove(int key)
- {
- _remove(root, key);
- }
- void print()
- {
- _print(root);
- }
- };
- int main()
- {
- freopen("in.txt", "r", stdin);
- freopen("out.txt", "w", stdout);
- scanf("%d", &k);
- int temp;
- tree t;
- while (scanf("%d", &temp) != -1)
- t.add(temp);
- //algo here
- t.print();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement