Advertisement
Guest User

Untitled

a guest
Feb 18th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.26 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct Node {
  6.     int key, height, diff;
  7.     Node *left, *right, *prev;
  8.  
  9.     Node(int key, Node *left, Node *right, Node *prev) :
  10.             key(key), height(1), diff(0), left(left), right(right), prev(prev) {}
  11. };
  12.  
  13. void setHeight(Node *u) {
  14.     if (u->left == nullptr && u->right == nullptr) {
  15.         u->height = 1;
  16.         u->diff = 0;
  17.     } else if (u->left == nullptr) {
  18.         u->height = u->right->height + 1;
  19.         u->diff = 0 - u->right->height;
  20.     } else if (u->right == nullptr) {
  21.         u->height = u->left->height + 1;
  22.         u->diff = u->left->height;
  23.     } else {
  24.         u->height = max(u->left->height, u->right->height) + 1;
  25.         u->diff = u->left->height - u->right->height;
  26.     }
  27. }
  28.  
  29. Node *rotateLeft(Node *u) {
  30.     Node *tmp = u->prev;
  31.     Node *c = u->right->left;
  32.     Node *v = u->right;
  33.     u->right = v->left;
  34.     v->left = u;
  35.     setHeight(u);
  36.     setHeight(v);
  37.     v->prev = tmp;
  38.     u->prev = v;
  39.     if (c != nullptr) {
  40.         c->prev = u;
  41.     }
  42.     return v;
  43. }
  44.  
  45. Node *rotateRight(Node *u) {
  46.     Node *tmp = u->prev;
  47.     Node *c = u->left->right;
  48.     Node *v = u->left;
  49.     u->left = v->right;
  50.     v->right = u;
  51.     setHeight(u);
  52.     setHeight(v);
  53.     v->prev = tmp;
  54.     u->prev = v;
  55.     if (c != nullptr) {
  56.         c->prev = u;
  57.     }
  58.     return v;
  59. }
  60.  
  61. Node *bigRotateLeft(Node *u) {
  62.     u->right = rotateRight(u->right);
  63.     return rotateLeft(u);
  64. }
  65.  
  66. Node *bigRotateRight(Node *u) {
  67.     u->left = rotateLeft(u->left);
  68.     return rotateRight(u);
  69. }
  70.  
  71. Node *next(Node *u, int key, Node *prev) {
  72.     while (u != nullptr) {
  73.         if (u->key > key) {
  74.             prev = u;
  75.             u = u->left;
  76.         } else {
  77.             u = u->right;
  78.         }
  79.     }
  80.     return prev;
  81. }
  82.  
  83. Node *prev(Node *u, int key, Node *prev) {
  84.     while (u != nullptr) {
  85.         if (u->key < key) {
  86.             prev = u;
  87.             u = u->right;
  88.         } else {
  89.             u = u->left;
  90.         }
  91.     }
  92.     return prev;
  93. }
  94.  
  95. Node *changeTree(Node *u) {
  96.     if (u->diff == 2 && (u->left->diff == 1 || u->left->diff == 0)) {
  97.         u = rotateRight(u);
  98.     } else if (u->diff == 2 && u->left->diff == -1) {
  99.         u = bigRotateRight(u);
  100.     } else if (u->diff == -2 && (u->right->diff == -1 || u->right->diff == 0)) {
  101.         u = rotateLeft(u);
  102.     } else if (u->diff == -2 && u->right->diff == 1) {
  103.         u = bigRotateLeft(u);
  104.     }
  105.     return u;
  106. }
  107.  
  108. Node *insert(Node *u, int key) {
  109.     if (u == nullptr) {
  110.         u = new Node(key, nullptr, nullptr, nullptr);
  111.     } else {
  112.         if (u->key > key) {
  113.             if (u->left == nullptr) {
  114.                 u->left = new Node(key, nullptr, nullptr, u);
  115.             } else {
  116.                 u->left = insert(u->left, key);
  117.             }
  118.         } else if (u->key < key) {
  119.             if (u->right == nullptr) {
  120.                 u->right = new Node(key, nullptr, nullptr, u);
  121.             } else {
  122.                 u->right = insert(u->right, key);
  123.             }
  124.         }
  125.     }
  126.     setHeight(u);
  127.     u = changeTree(u);
  128.     return u;
  129. }
  130.  
  131. Node *dlt(Node *u, int key) {
  132.     if (u != nullptr) {
  133.         if (u->key == key) {
  134.             if (u->left == nullptr && u->right == nullptr) {
  135.                 u = nullptr;
  136.             } else if (u->right == nullptr) {
  137.                 u = u->left;
  138.                 setHeight(u);
  139.                 u = changeTree(u);
  140.             } else if (u->left == nullptr) {
  141.                 u = u->right;
  142.                 setHeight(u);
  143.                 u = changeTree(u);
  144.             } else {
  145.                 Node *v = next(u, u->key, nullptr);
  146.                 u = dlt(u, v->key);
  147.                 u->key = v->key;
  148.                 setHeight(u);
  149.                 u = changeTree(u);
  150.             }
  151.         } else if (u->key > key) {
  152.             u->left = dlt(u->left, key);
  153.             setHeight(u);
  154.             u = changeTree(u);
  155.         } else {
  156.             u->right = dlt(u->right, key);
  157.             setHeight(u);
  158.             u = changeTree(u);
  159.         }
  160.     }
  161.     return u;
  162. }
  163.  
  164. bool exists(Node *u, int key) {
  165.     if (u == nullptr) {
  166.         return false;
  167.     } else {
  168.         if (u->key > key) {
  169.             if (u->left == nullptr) {
  170.                 return false;
  171.             } else {
  172.                 return exists(u->left, key);
  173.             }
  174.         } else if (u->key < key) {
  175.             if (u->right == nullptr) {
  176.                 return false;
  177.             } else {
  178.                 return exists(u->right, key);
  179.             }
  180.         } else {
  181.             return true;
  182.         }
  183.     }
  184. }
  185.  
  186. int main() {
  187.     string s;
  188.     int x;
  189.     Node *tree = nullptr;
  190.     while (cin >> s) {
  191.         cin >> x;
  192.         if (s == "insert") {
  193.             tree = insert(tree, x);
  194.         } else if (s == "delete") {
  195.             tree = dlt(tree, x);
  196.         } else if (s == "exists") {
  197.             cout << (exists(tree, x) ? "true" : "false") << endl;
  198.         } else if (s == "next") {
  199.             Node *u = next(tree, x, nullptr);
  200.             cout << (u != nullptr ? to_string(u->key) : "none") << endl;
  201.         } else if (s == "prev") {
  202.             Node *u = prev(tree, x, nullptr);
  203.             cout << (u != nullptr ? to_string(u->key) : "none") << endl;
  204.         }
  205.     }
  206.     return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement