Advertisement
sleepy_coder

Splay_Tree_C++

Jan 5th, 2019
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.56 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define MX 10005
  5.  
  6. class Splay_Tree {
  7.     unsigned int tree_size;
  8.  
  9.     typedef struct Node{
  10.         int key;
  11.         Node *left, *right, *parent;
  12.  
  13.         explicit Node(const int& val):left(nullptr), right(nullptr), parent(nullptr), key(val){}
  14.     }Node;
  15.     Node* root;
  16.  
  17.     void rotateLeft(Node *u);
  18.     void rotateRight(Node *u);
  19.     Node *join(Node *u, Node *v);
  20.     Node *getMaxNode(Node *u);
  21.     Node *insertBST(const int& val);
  22.     Node *search(Node *u, const int& val);
  23.     void splay(Node *u);
  24.  
  25.     void printNodeInternal(Node* nodes[MX], int last_indx, int level, int max_level);
  26.     void printNode(Node* R);
  27.     void printWhiteSpace(int cnt);
  28.     int maxLevel(Node* node);
  29.     bool isAllElementsNull(Node* nodes[MX], int last_indx);
  30.     Node* deleteNodes(Node* R);
  31.  
  32. public:
  33.  
  34.     Splay_Tree() : root(nullptr), tree_size(0) {}
  35.     void insert(const int& val);
  36.     bool find(const int& val);
  37.     void remove(const int& val);
  38.     unsigned int size(){ return tree_size; }
  39.     bool empty(){ return size()==0; }
  40.     void printBTree();
  41.  
  42.     virtual ~Splay_Tree(){
  43.         root = deleteNodes(this->root);
  44.         tree_size = 0;
  45.     }
  46. };
  47.  
  48.  
  49. void Splay_Tree::rotateLeft(Node *u){
  50.     if(u->right){
  51.         Node* v = u->right;
  52.         u->right = v->left;
  53.         if(v->left)v->left->parent = u;
  54.         v->parent = u->parent;
  55.         if(!u->parent)this->root = v;
  56.         else if( u == u->parent->left ) u->parent->left = v;
  57.         else u->parent->right = v;
  58.         v->left = u;
  59.         u->parent = v;
  60.     }
  61. }
  62.  
  63. void Splay_Tree::rotateRight(Node *u){
  64.     if(u->left){
  65.         Node* v = u->left;
  66.         u->left = v->right;
  67.         if(v->right)v->right->parent = u;
  68.         v->parent = u->parent;
  69.         if(!u->parent)this->root = v;
  70.         else if( u == u->parent->left ) u->parent->left = v;
  71.         else u->parent->right = v;
  72.         v->right = u;
  73.         u->parent = v;
  74.     }
  75. }
  76.  
  77. Splay_Tree::Node *Splay_Tree::join(Node* u, Node* v){
  78.     Node *node = nullptr, *left_root = u, *right_root = v;
  79.     Node* current_root = nullptr;
  80.     if(left_root){
  81.         left_root->parent = nullptr;
  82.         node = getMaxNode(left_root);
  83.         splay(node);
  84.         current_root = node;
  85.     }
  86.     if(right_root){
  87.         if(left_root) node->right = right_root;
  88.         else current_root = right_root;
  89.  
  90.         right_root->parent = node;
  91.     }
  92.     return current_root;
  93. }
  94.  
  95. Splay_Tree::Node *Splay_Tree::getMaxNode(Node* u){
  96.     while( u->right ) u = u->right;
  97.     return u;
  98. }
  99.  
  100. Splay_Tree::Node *Splay_Tree::insertBST(const int &val) {
  101.     Node *curr = this->root, *par = nullptr;
  102.     while(curr){
  103.         par = curr;
  104.         (val <= curr->key) ? curr = curr->left : curr = curr->right;
  105.     }
  106.     curr = new Node(val);
  107.     curr->parent = par;
  108.     if(!par)this->root = curr;
  109.     else (curr->key <= par->key) ? (par->left = curr) : (par->right = curr);
  110.     return curr;
  111. }
  112.  
  113. //returns null or node or parent(just before)
  114. Splay_Tree::Node *Splay_Tree::search(Node *u, const int& val){
  115.     if(!u || u->key==val)return u;
  116.     else if(val < u->key){
  117.         if(!u->left)return u;
  118.         else return search(u->left, val);
  119.     }
  120.     else{
  121.         if(!u->right)return u;
  122.         else return search(u->right, val);
  123.     }
  124. }
  125.  
  126.  
  127. void Splay_Tree::splay(Node* u){
  128.     while(true) {
  129.         if(!u->parent)break;
  130.         else if( !u->parent->parent ) {//left or right...makes u root
  131.             if( u->parent->left == u ) rotateRight( u->parent );
  132.             else rotateLeft( u->parent );
  133.         }
  134.         else if( u->parent->left == u && u->parent->parent->left == u->parent ) {//left left case
  135.             rotateRight( u->parent->parent );
  136.             rotateRight( u->parent );
  137.         }
  138.         else if( u->parent->left == u && u->parent->parent->right == u->parent ){ //right-left case
  139.             rotateRight( u->parent );
  140.             rotateLeft( u->parent );
  141.         }
  142.         else if( u->parent->right == u && u->parent->parent->right == u->parent ) {//right-right case
  143.             rotateLeft( u->parent->parent );
  144.             rotateLeft( u->parent );
  145.         }
  146.         else if( u->parent->right == u && u->parent->parent->left == u->parent ){//left-right case
  147.             rotateLeft( u->parent );
  148.             rotateRight( u->parent );
  149.         }
  150.     }
  151. }
  152.  
  153.  
  154. void Splay_Tree::insert(const int& val){
  155.     Node *current = insertBST(val);
  156.     this->tree_size++;
  157.     splay(current);
  158. }
  159.  
  160.  
  161. bool Splay_Tree::find(const int& val){
  162.     Node *node = search(this->root, val);
  163.     bool found;
  164.     found = !(!node || node->key != val);
  165.     if(node)splay(node);
  166.     return found;
  167. }
  168.  
  169.  
  170. void Splay_Tree::remove(const int& val){
  171.     Node *node = search(this->root, val);
  172.     if(!node)return;
  173.     else if(node->key!=val){
  174.         splay(node);
  175.         return;
  176.     }
  177.     else{
  178.         splay(node);
  179.         node = this->root;
  180.         Node *left_root = node->left, *right_root = node->right;
  181.         delete node;
  182.         node = nullptr;
  183.         this->root = join(left_root, right_root);
  184.         this->tree_size--;
  185.     }
  186. }
  187.  
  188.  
  189. //for printing purpose
  190. void Splay_Tree::printNodeInternal(Node* nodes[MX], int last_indx, int level, int max_level){
  191.     if(last_indx == 0 || isAllElementsNull(nodes, last_indx))
  192.         return;
  193.  
  194.     int floor = max_level - level;
  195.     int edgeLines = (int)pow(2, max(floor-1, 0));
  196.     int firstSpaces = (int)pow(2, floor) - 1;
  197.     int betweenSpaces = (int)pow(2, (floor+1))-1;
  198.  
  199.     printWhiteSpace(firstSpaces);
  200.  
  201.     Node* newNodes[MX];
  202.     int new_last_indx = 0;
  203.  
  204.     for(int i = 0; i < last_indx; i++){
  205.         Node* node = nodes[i];
  206.         if(node){
  207.             cout<<node->key;
  208.             newNodes[new_last_indx++] = node->left;
  209.             newNodes[new_last_indx++] = node->right;
  210.         }
  211.         else{
  212.             newNodes[new_last_indx++] = nullptr;
  213.             newNodes[new_last_indx++] = nullptr;
  214.             cout<<" ";
  215.         }
  216.         printWhiteSpace(betweenSpaces);
  217.     }
  218.     cout<<endl;
  219.  
  220.     for(int i = 1; i <= edgeLines ; ++i){
  221.         for(int j = 0; j < last_indx; j++){
  222.  
  223.             printWhiteSpace(firstSpaces - i);
  224.  
  225.             if(!nodes[j]){
  226.                 printWhiteSpace(edgeLines + edgeLines + i + 1);
  227.                 continue;
  228.             }
  229.  
  230.             if(nodes[j]->left)cout<<"/";
  231.             else printWhiteSpace(1);
  232.  
  233.             printWhiteSpace(i+i-1);
  234.  
  235.             if(nodes[j]->right)cout<<"\\";
  236.             else printWhiteSpace(1);
  237.  
  238.             printWhiteSpace(edgeLines + edgeLines - i);
  239.  
  240.         }
  241.         cout<<endl;
  242.     }
  243.  
  244.     printNodeInternal(newNodes, new_last_indx, level + 1, max_level);
  245.  
  246. }
  247.  
  248. void Splay_Tree::printNode(Node* R){
  249.     int max_level = maxLevel(R);
  250.     Node* nodes[MX];
  251.     int last_indx = 0;
  252.     nodes[last_indx++] = R;
  253.     printNodeInternal(nodes, last_indx, 1, max_level);
  254. }
  255.  
  256. void Splay_Tree::printWhiteSpace(int cnt){
  257.     for(int i = 0; i < cnt; i++)cout<<" ";
  258. }
  259.  
  260. int Splay_Tree::maxLevel(Node* node){
  261.     if(!node)return 0;
  262.     return max(maxLevel(node->left), maxLevel(node->right)) + 1;
  263. }
  264.  
  265. bool Splay_Tree::isAllElementsNull(Node* nodes[MX], int last_indx){
  266.     for(int i = 0; i < last_indx ; i++){
  267.         if(nodes[i] != nullptr)return false;
  268.     }
  269.     return true;
  270. }
  271.  
  272. Splay_Tree::Node *Splay_Tree::deleteNodes(Node *R){
  273.     if(R== nullptr)return R;
  274.     R->left = deleteNodes(R->left);
  275.     R->right = deleteNodes(R->right);
  276.     delete R;
  277.     R = nullptr;
  278.     return R;
  279. }
  280.  
  281. void Splay_Tree::printBTree(){
  282.     for(int i = 0 ; i < 50; i++)cout<<'_';
  283.     cout<<endl;
  284.     printNode(this->root);
  285.     cout<<endl;
  286.     for(int i = 0 ; i < 50; i++)cout<<'_';
  287.     cout<<endl;
  288. }
  289.  
  290.  
  291.  
  292. int main(){
  293.     Splay_Tree t;
  294.  
  295.     while(true){
  296.         cout<<"1. insert 2.look up 3. delete 4 print 5. size 6.exit "<<endl;
  297.         int n;
  298.         cin>>n;
  299.         if(n==1){
  300.             int num;
  301.             cin>>num;
  302.             t.insert(num);
  303.         }
  304.         else if(n==2){
  305.             int num;
  306.             cin>>num;
  307.             cout<<(!t.empty() && t.find(num)?"found":"not found")<<endl;
  308.         }
  309.         else if(n==3){
  310.             if(t.empty()){
  311.                 cout<<"Tree is empty"<<endl;
  312.                 continue;
  313.             }
  314.             int num;
  315.             cin>>num;
  316.             t.remove(num);
  317.         }
  318.         else if(n==4){
  319.             t.printBTree();
  320.         }
  321.         else if(n==5){
  322.             cout<<"Size: "<<t.size()<<endl;
  323.         }
  324.         else if(n==6){
  325.             break;
  326.         }
  327.     }
  328.  
  329.     return 0;
  330. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement