Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.89 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct AVLnode {
  6.     int val;
  7.     AVLnode* l;
  8.     AVLnode* r;
  9.     int h;
  10. };
  11.  
  12. int max(int a, int b) {
  13.     return (a > b) ? a : b;
  14. }
  15. int height(AVLnode* node) {
  16.     if (!node) return 0;
  17.     else return node->h;
  18. }
  19. int getBalance(AVLnode* node) {
  20.     if (!node) return 0;
  21.     else return height(node->l) - height(node->r);
  22. }
  23. AVLnode* minVal(AVLnode* node) {
  24.     AVLnode* min = node;
  25.     while (node->l) {
  26.         min = min->l;
  27.     }
  28.     return min;
  29. }
  30.  
  31. class AVL {
  32. private:
  33.     AVLnode* root;
  34.     void InsertNode(AVLnode* &node, int val);
  35.     void PrintInOrder(AVLnode* node);
  36.     AVLnode* RotL(AVLnode* &piv);
  37.     AVLnode* RotR(AVLnode* &piv);
  38.     void DeleteNode(AVLnode* &node, int val);
  39. public:
  40.     AVL();
  41.     void Insert(int val);
  42.     void Print();
  43.     void Delete(int val);
  44. };
  45.  
  46. AVL::AVL() {
  47.     root = NULL;
  48. }
  49.  
  50. void AVL::InsertNode(AVLnode* &node, int val) {
  51.     if (!node) {
  52.         AVLnode* newNode = new AVLnode;
  53.         newNode->val = val;
  54.         newNode->l = newNode->r = NULL;
  55.         newNode->h = 1;
  56.         node = newNode;
  57.     }
  58.     else {
  59.         if (val < node->val) {
  60.             InsertNode(node->l, val);
  61.         }
  62.         else {
  63.             InsertNode(node->r, val);
  64.         }
  65.         node->h = 1 + max(height(node->l), height(node->r));
  66.         int balance = getBalance(node);
  67.  
  68.         //Left Left Case
  69.         if (balance > 1 && val < node->l->val) {
  70.             node = RotR(node);
  71.         }
  72.         //Left Right Case
  73.         else if (balance > 1 && val > node->l->val) {
  74.             node->l = RotL(node->l);
  75.             node = RotR(node);
  76.         }
  77.         //Right Right Case
  78.         else if (balance < -1 && val > node->r->val) {
  79.             node = RotL(node);
  80.         }
  81.         //Right Left Case
  82.         else if (balance < -1 && val < node->r->val) {
  83.             node->r = RotR(node->r);
  84.             node = RotL(node);
  85.         }
  86.  
  87.     }
  88. }
  89. void AVL::Insert(int val) {
  90.     InsertNode(root, val);
  91. }
  92.  
  93. void AVL::PrintInOrder(AVLnode* node) {
  94.     if (node) {
  95.         PrintInOrder(node->l);
  96.         cout << node->val << " ";
  97.         PrintInOrder(node->r);
  98.     }
  99. }
  100. void AVL::Print() {
  101.     PrintInOrder(root);
  102. }
  103.  
  104. void AVL::DeleteNode(AVLnode* &node, int val) {
  105.     if (node) {
  106.         if (val > node->val) DeleteNode(node->r, val);
  107.         else if (val < node->val) DeleteNode(node->l, val);
  108.         else {
  109.             if (!node->l) {
  110.                 AVLnode* t = node->r;
  111.                 delete node;
  112.                 node = t;
  113.             }
  114.             else if (!node->r) {
  115.                 AVLnode* t = node->l;
  116.                 delete node;
  117.                 node = t;
  118.             }
  119.             //ma dwoje dzieci
  120.             else {
  121.                 AVLnode* t = minVal(node->r);
  122.                 node->val = t->val;
  123.                 DeleteNode(node->r, t->val);
  124.             }
  125.         }
  126.     }
  127.     if (node) {
  128.         node->h = 1 + max(height(node->l), height(node->r));
  129.         int balance = getBalance(node);
  130.         //Left Left Case
  131.         if (balance > 1 && getBalance(node->l) >= 0) {
  132.             node = RotR(node);
  133.         }
  134.         //Left Right Case
  135.         if (balance > 1 && getBalance(node->l) < 0) {
  136.             node->l = RotL(node->l);
  137.             node = RotR(node);
  138.         }
  139.         //Right Left Case
  140.         if (balance < -1 && getBalance(node->r) > 0) {
  141.             node->r = RotR(node->r);
  142.             node = RotL(node);
  143.         }
  144.         //Right Right Case
  145.         if (balance < -1 && getBalance(node->r) <= 0) {
  146.             node = RotL(node);
  147.         }
  148.     }
  149. }
  150. void AVL::Delete(int val) {
  151.     DeleteNode(root, val);
  152. }
  153.  
  154. AVLnode* AVL::RotL(AVLnode* &node) {
  155.     //AVLnode* t = node->r;
  156.     //AVLnode* t2 = t->l;
  157.     //t->l = node;
  158.     //node->r = t2;
  159.     AVLnode* t = node->r;
  160.     node->r = t->l;
  161.     t->l = node;
  162.     node->h = 1 + max(height(node->l), height(node->r));
  163.     t->h = 1 + max(height(t->l), height(t->r));
  164.     return t;
  165. }
  166. AVLnode* AVL::RotR(AVLnode* &node) {
  167.     //AVLnode* t = node->l;
  168.     //AVLnode* t2 = t->r;
  169.     //t->r = node;
  170.     //node->l = t2;
  171.     AVLnode* t = node->l;
  172.     node->l = t->r;
  173.     t->r = node;
  174.     node->h = 1 + max(height(node->l), height(node->r));
  175.     t->h = 1 + max(height(t->l), height(t->r));
  176.     return t;
  177. }
  178.  
  179.  
  180.  
  181. int main() {
  182.     AVL tree;
  183.  
  184.     //tree.Insert(13);
  185.     //tree.Insert(10);
  186.     //tree.Insert(15);
  187.     //tree.Insert(5);
  188.     //tree.Insert(11);
  189.     //tree.Insert(16);
  190.     //tree.Insert(4);
  191.     //tree.Insert(6);
  192.     //tree.Insert(7);
  193.  
  194.     tree.Insert(2);
  195.     tree.Insert(1);
  196.     tree.Insert(3);
  197.  
  198.     tree.Delete(2);
  199.  
  200.  
  201.     system("PAUSE");
  202.     return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement