Advertisement
Guest User

Untitled

a guest
Jul 27th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cassert>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <iostream>
  6. using namespace std;
  7.  
  8. int k;
  9. struct node
  10. {
  11.     node *left, *right, *par;
  12.     int key;
  13.     node(int k, node * a = 0, node * b = 0, node *c = 0): key(k), left(a), right(b), par(c){}
  14. };
  15.  
  16. class tree
  17. {
  18.     node * root;
  19.  
  20.     void _add(node *cur, int key)
  21.     {
  22.         if (!root){
  23.             root = new node(key); return;}
  24.  
  25.         if (cur->key > key)
  26.             if (!cur->left)
  27.                 cur->left = new node(key, 0, 0, cur);
  28.             else _add(cur->left, key);
  29.         else
  30.             if (cur->key < key)
  31.                 if (!cur->right)
  32.                     cur->right = new node(key, 0, 0, cur);
  33.                 else _add(cur->right, key);
  34.     }
  35.  
  36.     void _remove(node *cur, int key)
  37.     {
  38.         if (!cur)   return;
  39.         if (cur->key < key)
  40.             _remove(cur->right, key);
  41.         else if (cur->key > key)
  42.             _remove(cur->left, key);
  43.         else
  44.         {
  45. routine:    if (!cur->left && !cur->right)
  46.             {
  47.                 if (cur->par->left == cur)
  48.                      cur->par->left = 0, delete cur;
  49.                 else
  50.                     cur->par->right = 0, delete cur;
  51.             }
  52.             else if (cur->left && cur->right)
  53.             {
  54.                 node *temp = cur->left;
  55.                 while (temp->right)
  56.                     temp = temp->right;
  57.                
  58.                 swap(cur->key, temp->key);
  59.                 cur = temp;
  60.                 goto routine;
  61.             }
  62.             else
  63.             {
  64.                 int anc = 0;
  65.                 if (cur->left)
  66.                     anc = 1;
  67.                 if (anc)
  68.                     if (cur->par)
  69.                         if (cur->par->left == cur)
  70.                             cur->par->left = cur->left, cur->left->par = cur->par, delete cur;
  71.                         else
  72.                             cur->par->right = cur->left, cur->left->par = cur->par, delete cur;
  73.                     else
  74.                     {
  75.                         node * temp = root;
  76.                         root = root->left;
  77.                         delete temp;
  78.                     }
  79.                 else
  80.                     if (cur->par)
  81.                         if (cur->par->left == cur)
  82.                             cur->par->left = cur->right, cur->right->par = cur->par, delete cur;
  83.                         else
  84.                             cur->par->right = cur->right, cur->right->par = cur->par, delete cur;
  85.                     else
  86.                     {
  87.                         node * temp = root;
  88.                         root = root->right;
  89.                         delete temp;
  90.                     }              
  91.  
  92.             }
  93.         }
  94.     }
  95.  
  96.     void _print(node * cur)
  97.     {
  98.         if (cur)
  99.         {
  100.             printf("%d\n", cur->key);
  101.             _print(cur->left);
  102.             _print(cur->right);
  103.         }
  104.     }
  105. public:
  106.     tree()
  107.     {
  108.         root = 0;
  109.     }
  110.     tree(int s)
  111.     {
  112.         root = new node(s);
  113.     }
  114.     void add(int key)
  115.     {
  116.         _add(root, key);
  117.     }
  118.  
  119.     void remove(int key)
  120.     {
  121.         _remove(root, key);
  122.     }
  123.     void print()
  124.     {
  125.         _print(root);
  126.     }
  127. };
  128.  
  129. int main()
  130. {
  131.     freopen("in.txt", "r", stdin);
  132.     freopen("out.txt", "w", stdout);
  133.     scanf("%d", &k);
  134.     int temp;
  135.     tree t;
  136.     while (scanf("%d", &temp) != -1)
  137.         t.add(temp);
  138.  
  139.     //algo here
  140.     t.print();
  141.  
  142.     return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement