Advertisement
Singasking

Untitled

Nov 20th, 2022
770
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.72 KB | None | 0 0
  1. //Splay tree implementation in C++
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. class Node {
  6.     public:
  7.         int data;
  8.         Node* parent;
  9.         Node* left;
  10.         Node* right;
  11.  
  12.     Node(int d) {
  13.         data = d;
  14.         parent=NULL;
  15.         left=NULL;
  16.         right=NULL;
  17.  
  18.     }
  19.  
  20.  
  21.  
  22. };
  23.  
  24. class SplayTree {
  25.     public:
  26.         Node* root=NULL;
  27.  
  28.         void LR(Node* x) {
  29.             //Left rotate the node
  30.          
  31.             Node* y = x->right;
  32.             y->parent = x->parent;
  33.          
  34.            if(x->parent!=NULL && x->parent->right==x) { x->parent->right=y;}
  35.             if(x->parent!=NULL && x->parent->left==x) { x->parent->left = y; }
  36.             x->right = y->left;
  37.            if(y->left!=NULL) { y->left->parent=x; }
  38.          
  39.             y->left=x;
  40.        
  41.            x->parent=y;
  42.            
  43.            if(y->parent==NULL) { root=y; }
  44.                  //cout<<"i cri";
  45.         }
  46.        
  47.         void RR(Node* x) {
  48.             Node* y = x->left;
  49.             y->parent = x->parent;
  50.             if(x->parent!=NULL && x->parent->right==x) { x->parent->right=y;}
  51.             if(x->parent!=NULL && x->parent->left==x) { x->parent->left=y;}
  52.             x->left = y->right;
  53.             if(y->right!=NULL) { y->right->parent=x; }
  54.             y->right = x;
  55.             x->parent = y;
  56.            
  57.              if(y->parent==NULL) { root=y; }
  58.         }
  59.         void Splay(Node* node) {
  60.            cout<<"in";
  61.            if(node->parent==NULL) { return; }
  62.            cout<<"Ok";
  63.             while(node->parent!=NULL) {
  64.  
  65.                
  66.                 if(node->parent==root) {
  67.                    cout<<"into this alive "<<endl;
  68.                     if(node->parent->right==node) {
  69.                         //Perform left rotation on root
  70.                       //  cout<<"hello i cri";
  71.                         LR(root);
  72.                        // cout<<"god please help me";
  73.  
  74.                     } else if(node->parent->left==node) {
  75.                         //Perform right rotation on root
  76.                         RR(root);
  77.                     }
  78.                 } else {
  79.                     //At least at height = 2
  80.                    
  81.                     if(node->parent->right == node && node->parent->parent->right ==node->parent) {
  82.                        
  83.                         //Perform left rotation on node's parent parent first then on node-sp parent
  84.                         LR(node->parent->parent);
  85.                       //cout<<"new root is: "<<root->data<<"and "<<node->parent->data<<endl;
  86.                         LR(node->parent);
  87.                     }
  88.                     else if(node->parent->left!=NULL && node->parent->left==node && node->parent->parent->left==node->parent) {
  89.                         //perform right rotation on node's grandparent then note's parent
  90.                         RR(node->parent->parent);
  91.                         RR(node->parent);
  92.  
  93.                     }
  94.  
  95.                     else if(node->parent->left ==node && node->parent->parent->right == node->parent) {
  96.                         //perform right rotation on node's parent followed by left rotation on node's grandparent
  97.                       Node *grandparent = node->parent->parent;
  98.                         RR(node->parent);
  99.                        // cout<<node->parent->parent->data;
  100.                         LR(grandparent);
  101.                          
  102.                     }
  103.                
  104.                     else if(node->parent->right==node && node->parent->parent->left==node->parent) {
  105.                         //left rotation on node's parent followed by right rotation on node's grandparent
  106.                          Node *grandparent = node->parent->parent;
  107.                         LR(node->parent);
  108.        
  109.                         RR(grandparent);
  110.                     }
  111.                 }
  112.             }
  113.             //Inorder(root);
  114.            
  115.         }
  116.        
  117.         void Inorder(Node* root) {
  118.             if(root==NULL) { return; }
  119.             Inorder(root->left);
  120.             cout<<root->data<<" ";
  121.             Inorder(root->right);
  122.         }
  123.         void Insert(int value) {
  124.             Node* temp = root;
  125.             if(temp!=NULL) { cout<<"root is : "<<temp->data<<endl; }
  126.             Node* temp_parent = NULL;
  127.              
  128.             while(temp!=NULL) {
  129.                 temp_parent = temp;
  130.               //  cout<<"temp is :"<<temp->data<<endl;
  131.                 int data = temp->data;
  132.                 if((data)<value) {temp = temp->right; }
  133.                 if((data)>value) { temp = temp->left; }
  134.                 //cout<<"ok"<<endl;
  135.                 //cout<<"new temp is "<<temp<<endl;
  136.                 if(temp==NULL) {break; }
  137.                
  138.             }
  139.          
  140.          
  141.             if(temp_parent==NULL) { root = new Node(value); return; }
  142.              
  143.             if(temp_parent!=NULL) {
  144.                 Node *x = new Node(value);
  145.                 int data = temp_parent->data;
  146.                 if(value<data) {x->parent=temp_parent; temp_parent->left=x;  }
  147.                 if(value>data) {x->parent=temp_parent; temp_parent->right=x;  }
  148.                
  149.                 Splay(x);
  150.                  
  151.             }
  152.          
  153.         }
  154.     Node* FindSuccessor(Node* node) {
  155.         //cout<<"called"<<node->data<<endl;
  156.         while(node->left!=NULL) { node=node->left;}
  157.         return node;
  158.     }
  159.     void Delete(int value) {
  160.         Node *temp = root;
  161.         Node* temp_node = NULL;
  162.        
  163.         //To implement delete function
  164.         while(1) {
  165.             temp_node = temp;
  166.            
  167.           cout<<temp_node->data<<endl;
  168.         //  cout<<"temp ebfore"<<temp->data<<endl;
  169.             if(temp->data<value) { temp = temp->right;}
  170.             else if(temp->data>value) { temp = temp->left; }
  171.            // cout<<temp<<endl;
  172.              //cout<<"temp after "<<temp->data<<endl;
  173.              cout<<"works"<<endl;
  174.             if(temp==NULL) { break; }
  175.             if(temp->data==value) { break; }
  176.          cout<<"in loop"<<endl;
  177.          
  178.         }
  179.         cout<<"finally"<<temp_node->data<<endl;
  180.         if(temp==NULL) { cout<<"yes";Splay(temp_node); return; }
  181.         if(temp_node->data==16) {
  182.             cout<<"left child: "<<temp->left<<" right child: "<<temp->right<<endl;
  183.         }    
  184.         //CASE 1: Node has no child
  185.         if(temp->left==NULL and temp->right==NULL) {
  186.             //if its root node;
  187.             if(temp->parent==NULL) {
  188.                 delete temp;
  189.                 root = NULL;
  190.  
  191.             } else if(temp->parent!=NULL) {
  192.                 //Leaf node
  193.                 cout<<"17 is a leaf node"<<endl;
  194.                 Node *tempnode = temp;
  195.                 Node *temp_parent = temp->parent;
  196.                  cout<<tempnode->parent->data<<endl;
  197.                 if(temp->parent->right==temp) { temp->parent->right=NULL;}
  198.                 if(temp->parent->left==temp) { temp->parent->left=NULL; }
  199.                 delete temp;
  200.                 //Splay the parent
  201.                 cout<<temp_parent->data<<endl;
  202.                 Splay(temp_parent);
  203.             }
  204.         //CASE 2: LEFT CHILD BUT NO RIGHT CHILD
  205.         } else if(temp->left!=NULL && temp->right==NULL) {
  206.             cout<<"into this"<<endl;
  207.                 Node *tempnode = temp;
  208.                 if(temp->parent!=NULL) {
  209.                 if(temp->parent->left==temp) { temp->parent->left = temp->left; temp->left->parent=temp->parent;}
  210.                 else if(temp->parent->right==temp) { temp->parent->right = temp->left;temp->left->parent=temp->parent; }
  211.            
  212.                 Splay(tempnode->parent); } else { root = temp->left; temp->left->parent=NULL;}
  213.         //CASE 3: RIGHT CHILD BUT NO LEFT CHILD
  214.         } else if(temp->right!=NULL && temp->left==NULL) {
  215.                 Node *tempnode = temp;
  216.                 if(temp->parent!=NULL) {
  217.                 if(temp->parent->right==temp) { temp->parent->right = temp->right;temp->right->parent = temp->parent;}
  218.                 else if(temp->parent->left==temp) { temp->parent->left = temp->right;temp->right->parent = temp->parent; }
  219.                 Splay(tempnode->parent);
  220.                 } else {
  221.                     root=temp->right;
  222.                     temp->right->parent=NULL;
  223.                 }
  224.         //CASE 4: BOTH CHILD
  225.         } else if(temp->right!=NULL && temp->left!=NULL) {
  226.             cout<<"both child"<<endl;
  227.             Node* parent = temp->parent;
  228.            
  229.             Node* tempnode = FindSuccessor(temp->right);//Find successor
  230.             cout<<tempnode->data<<endl;
  231.             cout<<tempnode->parent<<endl;
  232.             temp->data = tempnode->data;
  233.            
  234.             if(tempnode->parent->right==tempnode) { cout<<"right";tempnode->parent->right = NULL;}
  235.             if(tempnode->parent->left==tempnode) { tempnode->parent->left = NULL; }
  236.             Node* tempnode_parent = tempnode->parent;
  237.             delete tempnode;
  238.            
  239.             if(parent!=NULL) { Splay(parent);}
  240.             cout<<"ok"<<endl;
  241.         }
  242.        
  243.         }
  244.        
  245.    
  246.        
  247. };
  248.  
  249.  
  250.  
  251. int main() {
  252.     SplayTree tree;
  253.     int n;
  254.     /**cout<<"Enter number of nodes: ";
  255.     cin>>n;
  256.     while(n--) {
  257.         cout<<"\n Enter node: ";
  258.         int x;
  259.         cin>>x;
  260.         tree.Insert(x);
  261.         cout<<"\n Inorder: ";
  262.         tree.Inorder(tree.root);
  263.         cout<<"new root is : "<<tree.root->data<<endl;
  264.         cout<<endl;
  265.        
  266.     }**/
  267.     tree.root = new Node(14);
  268.     tree.root->left = new Node(13);
  269.     tree.root->left->parent = tree.root;
  270.     tree.root->left->left = new Node(7);
  271.     tree.root->left->left->parent = tree.root->left;
  272.     tree.root->left->left->right = new Node(10);
  273.     tree.root->left->left->right->right = new Node(12);
  274.     tree.root->left->left->right->right->parent = tree.root->left->left->right;
  275.     tree.root->left->left->right->parent = tree.root->left->left;
  276.     tree.root->right = new Node(16);
  277.     tree.root->right->parent = tree.root;
  278.     tree.root->right->right = new Node(17);
  279.     tree.root->right->right->parent = tree.root->right;
  280.     tree.root->right->left = new Node(15);
  281.     tree.root->right->left->parent = tree.root->right;
  282.  
  283.  
  284.    cout<<"Enter number of nodes to delete: ";
  285.     cin>>n;
  286.     while(n--) {
  287.         cout<<"\n Enter node: ";
  288.         int x;
  289.         cin>>x;
  290.         tree.Delete(x);
  291.         cout<<"\n Inorder: ";
  292.         tree.Inorder(tree.root);
  293.         cout<<"new root is : "<<tree.root->data<<endl;
  294.         cout<<endl;
  295.        
  296.     }
  297. //    cout<<tree.root->data<<" "<<tree.root->right->data<<" "<<tree.root->right->left->data<<" "<<tree.root->right->left->right->data<<" ";
  298.    
  299.     //tree.Insert(10);
  300.     //tree.Insert(17);
  301.     //tree.Insert(7);
  302.     //tree.Insert(13);
  303.     //tree.Insert(16);
  304. }
  305.  
  306.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement