Advertisement
Singasking

Untitled

Nov 20th, 2022
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.32 KB | None | 0 0
  1. // C++ program for the above approach
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. // AVL tree node
  6. struct AVLwithparent {
  7.     struct AVLwithparent* left;
  8.     struct AVLwithparent* right;
  9.     int key;
  10.     struct AVLwithparent* par;
  11.     int height;
  12. };
  13.  
  14. // Function to print the preorder
  15. // traversal of the AVL tree
  16. void printpreorder(struct AVLwithparent* root)
  17. {
  18.     // Print the node's value along
  19.     // with its parent value
  20.     cout << "Node: " << root->key
  21.          << ", Parent Node: ";
  22.  
  23.     if (root->par != NULL)
  24.         cout << root->par->key << endl;
  25.     else
  26.         cout << "NULL" << endl;
  27.  
  28.     // Recur to the left subtree
  29.     if (root->left != NULL) {
  30.         printpreorder(root->left);
  31.     }
  32.  
  33.     // Recur to the right subtree
  34.     if (root->right != NULL) {
  35.         printpreorder(root->right);
  36.     }
  37. }
  38.  
  39. // Function to update the height of
  40. // a node according to its children's
  41. // node's heights
  42. void Updateheight(
  43.     struct AVLwithparent* root)
  44. {
  45.     if (root != NULL) {
  46.  
  47.         // Store the height of the
  48.         // current node
  49.         int val = 1;
  50.  
  51.         // Store the height of the left
  52.         // and right subtree
  53.         if (root->left != NULL)
  54.             val = root->left->height + 1;
  55.  
  56.         if (root->right != NULL)
  57.             val = max(
  58.                 val, root->right->height + 1);
  59.  
  60.         // Update the height of the
  61.         // current node
  62.         root->height = val;
  63.     }
  64. }
  65.  
  66. // Function to handle Left Left Case
  67. struct AVLwithparent* LLR(
  68.     struct AVLwithparent* root)
  69. {
  70.     // Create a reference to the
  71.     // left child
  72.     struct AVLwithparent* tmpnode = root->left;
  73.  
  74.     // Update the left child of the
  75.     // root to the right child of the
  76.     // current left child of the root
  77.     root->left = tmpnode->right;
  78.  
  79.     // Update parent pointer of left
  80.     // child of the root node
  81.     if (tmpnode->right != NULL)
  82.         tmpnode->right->par = root;
  83.  
  84.     // Update the right child of
  85.     // tmpnode to root
  86.     tmpnode->right = root;
  87.  
  88.     // Update parent pointer of tmpnode
  89.     tmpnode->par = root->par;
  90.  
  91.     // Update the parent pointer of root
  92.     root->par = tmpnode;
  93.  
  94.     // Update tmpnode as the left or
  95.     // the right child of its parent
  96.     // pointer according to its key value
  97.     if (tmpnode->par != NULL
  98.         && root->key < tmpnode->par->key) {
  99.         tmpnode->par->left = tmpnode;
  100.     }
  101.     else {
  102.         if (tmpnode->par != NULL)
  103.             tmpnode->par->right = tmpnode;
  104.     }
  105.  
  106.     // Make tmpnode as the new root
  107.     root = tmpnode;
  108.  
  109.     // Update the heights
  110.     Updateheight(root->left);
  111.     Updateheight(root->right);
  112.     Updateheight(root);
  113.     Updateheight(root->par);
  114.  
  115.     // Return the root node
  116.     return root;
  117. }
  118.  
  119. // Function to handle Right Right Case
  120. struct AVLwithparent* RRR(
  121.     struct AVLwithparent* root)
  122. {
  123.     // Create a reference to the
  124.     // right child
  125.     struct AVLwithparent* tmpnode = root->right;
  126.  
  127.     // Update the right child of the
  128.     // root as the left child of the
  129.     // current right child of the root
  130.     root->right = tmpnode->left;
  131.  
  132.     // Update parent pointer of the
  133.     // right child of the root node
  134.     if (tmpnode->left != NULL)
  135.         tmpnode->left->par = root;
  136.  
  137.     // Update the left child of the
  138.     // tmpnode to root
  139.     tmpnode->left = root;
  140.  
  141.     // Update parent pointer of tmpnode
  142.     tmpnode->par = root->par;
  143.  
  144.     // Update the parent pointer of root
  145.     root->par = tmpnode;
  146.  
  147.     // Update tmpnode as the left or
  148.     // the right child of its parent
  149.     // pointer according to its key value
  150.     if (tmpnode->par != NULL
  151.         && root->key < tmpnode->par->key) {
  152.         tmpnode->par->left = tmpnode;
  153.     }
  154.     else {
  155.         if (tmpnode->par != NULL)
  156.             tmpnode->par->right = tmpnode;
  157.     }
  158.  
  159.     // Make tmpnode as the new root
  160.     root = tmpnode;
  161.  
  162.     // Update the heights
  163.     Updateheight(root->left);
  164.     Updateheight(root->right);
  165.     Updateheight(root);
  166.     Updateheight(root->par);
  167.  
  168.     // Return the root node
  169.     return root;
  170. }
  171.  
  172. // Function to handle Left Right Case
  173. struct AVLwithparent* LRR(
  174.     struct AVLwithparent* root)
  175. {
  176.     root->left = RRR(root->left);
  177.     return LLR(root);
  178. }
  179.  
  180. // Function to handle right left case
  181. struct AVLwithparent* RLR(
  182.     struct AVLwithparent* root)
  183. {
  184.     root->right = LLR(root->right);
  185.     return RRR(root);
  186. }
  187.  
  188. // Function to balance the tree after
  189. // deletion of a node
  190. struct AVLwithparent* Balance(
  191.     struct AVLwithparent* root)
  192. {
  193.     // Store the current height of
  194.     // the left and right subtree
  195.     int firstheight = 0;
  196.     int secondheight = 0;
  197.  
  198.     if (root->left != NULL)
  199.         firstheight = root->left->height;
  200.  
  201.     if (root->right != NULL)
  202.         secondheight = root->right->height;
  203.  
  204.     // If current node is not balanced
  205.     if (abs(firstheight - secondheight) == 2) {
  206.         if (firstheight < secondheight) {
  207.  
  208.             // Store the height of the
  209.             // left and right subtree
  210.             // of the current node's
  211.             // right subtree
  212.             int rightheight1 = 0;
  213.             int rightheight2 = 0;
  214.             if (root->right->right != NULL)
  215.                 rightheight2 = root->right->right->height;
  216.  
  217.             if (root->right->left != NULL)
  218.                 rightheight1 = root->right->left->height;
  219.  
  220.             if (rightheight1 > rightheight2) {
  221.  
  222.                 // Right Left Case
  223.                 root = RLR(root);
  224.             }
  225.             else {
  226.  
  227.                 // Right Right Case
  228.                 root = RRR(root);
  229.             }
  230.         }
  231.         else {
  232.  
  233.             // Store the height of the
  234.             // left and right subtree
  235.             // of the current node's
  236.             // left subtree
  237.             int leftheight1 = 0;
  238.             int leftheight2 = 0;
  239.             if (root->left->right != NULL)
  240.                 leftheight2 = root->left->right->height;
  241.  
  242.             if (root->left->left != NULL)
  243.                 leftheight1 = root->left->left->height;
  244.  
  245.             if (leftheight1 > leftheight2) {
  246.  
  247.                 // Left Left Case
  248.                 root = LLR(root);
  249.             }
  250.             else {
  251.  
  252.                 // Left Right Case
  253.                 root = LRR(root);
  254.             }
  255.         }
  256.     }
  257.  
  258.     // Return the root node
  259.     return root;
  260. }
  261.  
  262. // Function to insert a node in
  263. // the AVL tree
  264. struct AVLwithparent* Insert(
  265.     struct AVLwithparent* root,
  266.     struct AVLwithparent* parent,
  267.     int key)
  268. {
  269.  
  270.     if (root == NULL) {
  271.  
  272.         // Create and assign values
  273.         // to a new node
  274.         root = new struct AVLwithparent;
  275.         if (root == NULL)
  276.             cout << "Error in memory" << endl;
  277.         else {
  278.             root->height = 1;
  279.             root->left = NULL;
  280.             root->right = NULL;
  281.             root->par = parent;
  282.             root->key = key;
  283.         }
  284.     }
  285.  
  286.     else if (root->key > key) {
  287.  
  288.         // Recur to the left subtree
  289.         // to insert the node
  290.         root->left = Insert(root->left,
  291.                             root, key);
  292.  
  293.         // Store the heights of the
  294.         // left and right subtree
  295.         int firstheight = 0;
  296.         int secondheight = 0;
  297.  
  298.         if (root->left != NULL)
  299.             firstheight = root->left->height;
  300.  
  301.         if (root->right != NULL)
  302.             secondheight = root->right->height;
  303.  
  304.         // Balance the tree if the
  305.         // current node is not balanced
  306.         if (abs(firstheight
  307.                 - secondheight)
  308.             == 2) {
  309.  
  310.             if (root->left != NULL
  311.                 && key < root->left->key) {
  312.  
  313.                 // Left Left Case
  314.                 root = LLR(root);
  315.             }
  316.             else {
  317.  
  318.                 // Left Right Case
  319.                 root = LRR(root);
  320.             }
  321.         }
  322.     }
  323.  
  324.     else if (root->key < key) {
  325.  
  326.         // Recur to the right subtree
  327.         // to insert the node
  328.         root->right = Insert(root->right,
  329.                              root, key);
  330.  
  331.         // Store the heights of the left
  332.         // and right subtree
  333.         int firstheight = 0;
  334.         int secondheight = 0;
  335.  
  336.         if (root->left != NULL)
  337.             firstheight = root->left->height;
  338.  
  339.         if (root->right != NULL)
  340.             secondheight = root->right->height;
  341.  
  342.         // Balance the tree if the
  343.         // current node is not balanced
  344.         if (abs(firstheight - secondheight) == 2) {
  345.             if (root->right != NULL
  346.                 && key < root->right->key) {
  347.  
  348.                 // Right Left Case
  349.                 root = RLR(root);
  350.             }
  351.             else {
  352.  
  353.                 // Right Right Case
  354.                 root = RRR(root);
  355.             }
  356.         }
  357.     }
  358.  
  359.     // Case when given key is
  360.     // already in tree
  361.     else {
  362.     }
  363.  
  364.     // Update the height of the
  365.     // root node
  366.     Updateheight(root);
  367.  
  368.     // Return the root node
  369.     return root;
  370. }
  371.  
  372. // Function to delete a node from
  373. // the AVL tree
  374. struct AVLwithparent* Delete(
  375.     struct AVLwithparent* root,
  376.     int key)
  377. {
  378.     if (root != NULL) {
  379.  
  380.         // If the node is found
  381.         if (root->key == key) {
  382.  
  383.             // Replace root with its
  384.             // left child
  385.             if (root->right == NULL
  386.                 && root->left != NULL) {
  387.                 if (root->par != NULL) {
  388.                     if (root->par->key
  389.                         < root->key)
  390.                         root->par->right = root->left;
  391.                     else
  392.                         root->par->left = root->left;
  393.  
  394.                     // Update the height
  395.                     // of root's parent
  396.                     Updateheight(root->par);
  397.                 }
  398.  
  399.                 root->left->par = root->par;
  400.  
  401.                 // Balance the node
  402.                 // after deletion
  403.                 root->left = Balance(
  404.                     root->left);
  405.  
  406.                 return root->left;
  407.             }
  408.  
  409.             // Replace root with its
  410.             // right child
  411.             else if (root->left == NULL
  412.                      && root->right != NULL) {
  413.                 if (root->par != NULL) {
  414.                     if (root->par->key
  415.                         < root->key)
  416.                         root->par->right = root->right;
  417.                     else
  418.                         root->par->left = root->right;
  419.  
  420.                     // Update the height
  421.                     // of the root's parent
  422.                     Updateheight(root->par);
  423.                 }
  424.  
  425.                 root->right->par = root->par;
  426.  
  427.                 // Balance the node after
  428.                 // deletion
  429.                 root->right = Balance(root->right);
  430.                 return root->right;
  431.             }
  432.  
  433.             // Remove the references of
  434.             // the current node
  435.             else if (root->left == NULL
  436.                      && root->right == NULL) {
  437.                 if (root->par->key < root->key) {
  438.                     root->par->right = NULL;
  439.                 }
  440.                 else {
  441.                     root->par->left = NULL;
  442.                 }
  443.  
  444.                 if (root->par != NULL)
  445.                     Updateheight(root->par);
  446.  
  447.                 root = NULL;
  448.                 return NULL;
  449.             }
  450.  
  451.             // Otherwise, replace the
  452.             // current node with its
  453.             // successor and then
  454.             // recursively call Delete()
  455.             else {
  456.                 struct AVLwithparent* tmpnode = root;
  457.                 tmpnode = tmpnode->right;
  458.                 while (tmpnode->left != NULL) {
  459.                     tmpnode = tmpnode->left;
  460.                 }
  461.  
  462.                 int val = tmpnode->key;
  463.  
  464.                 root->right
  465.                     = Delete(root->right, tmpnode->key);
  466.  
  467.                 root->key = val;
  468.  
  469.                 // Balance the node
  470.                 // after deletion
  471.                 root = Balance(root);
  472.             }
  473.         }
  474.  
  475.         // Recur to the right subtree to
  476.         // delete the current node
  477.         else if (root->key < key) {
  478.             root->right = Delete(root->right, key);
  479.  
  480.             root = Balance(root);
  481.         }
  482.  
  483.         // Recur into the right subtree
  484.         // to delete the current node
  485.         else if (root->key > key) {
  486.             root->left = Delete(root->left, key);
  487.  
  488.             root = Balance(root);
  489.         }
  490.  
  491.         // Update height of the root
  492.         if (root != NULL) {
  493.             Updateheight(root);
  494.         }
  495.     }
  496.  
  497.     // Handle the case when the key to be
  498.     // deleted could not be found
  499.     else {
  500.         cout << "Key to be deleted "
  501.              << "could not be found\n";
  502.     }
  503.  
  504.     // Return the root node
  505.     return root;
  506. }
  507.  
  508. // Driver Code
  509. int main()
  510. {
  511.     struct AVLwithparent* root;
  512.     root = NULL;
  513.  
  514.     // Function call to insert the nodes
  515.     root = Insert(root, NULL, 9);
  516.     root = Insert(root, NULL, 5);
  517.     root = Insert(root, NULL, 10);
  518.     root = Insert(root, NULL, 0);
  519.     root = Insert(root, NULL, 6);
  520.  
  521.     // Print the tree before deleting node
  522.     cout << "Before deletion:\n";
  523.     printpreorder(root);
  524.  
  525.     // Function Call to delete node 10
  526.     root = Delete(root, 10);
  527.  
  528.     // Print the tree after deleting node
  529.     cout << "After deletion:\n";
  530.     printpreorder(root);
  531. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement