Advertisement
leo11

AVL tree

Dec 21st, 2021
848
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include<iostream>
  3. #include<string>
  4. #include<cstdlib>
  5. #include<conio.h>
  6. #include<vector>
  7. #include<iomanip>
  8. using namespace sf;
  9.  
  10.  
  11. struct node {
  12.     int         key;
  13.     uint8_t     height;
  14.  
  15.     node*       left;
  16.     node*       right;
  17.  
  18.     node(int k, node* leftC = nullptr, node* rightC = nullptr) :
  19.             key(k), left(leftC), right(rightC), height(1) {}
  20.  
  21. };
  22.  
  23.  
  24. class AVL_Tree {
  25. public:
  26.     AVL_Tree(node* _root) : root(_root) {}
  27.  
  28.     node* insert(int k)
  29.     {
  30.         root = insert(root, k);
  31.     }
  32.  
  33.     void search(int k) {
  34.         root = find(root, k);
  35.     }
  36.  
  37. private:
  38.  
  39.     node* find(node* v, int k) {
  40.         if (v == nullptr)
  41.             return nullptr;
  42.         else if (k < v->key) {
  43.             return find(v->left, k);
  44.         }
  45.         else if (k > v->key) {
  46.             return find(v->right, k);
  47.         }
  48.         else
  49.             return v;
  50.     }
  51.  
  52.     node* insert(node* v, int k) // вставка ключа k в дерево с корнем p
  53.     {
  54.         if (!v) return new node(k);
  55.         if (k < v->key)
  56.             v->left = insert(v->left, k);
  57.         else
  58.             v->right = insert(v->right, k);
  59.         return balance(v);
  60.     }
  61.     uint8_t getHeight(node* v) {
  62.         return (v ? v->height : 0);
  63.     }
  64.  
  65.     int balanceFactor(node* v) {
  66.         return getHeight(v->right) - getHeight(v->left);
  67.     }
  68.  
  69.     void fixHeight(node* v) {
  70.         uint8_t hl = getHeight(v->left);
  71.         uint8_t hr = getHeight(v->right);
  72.  
  73.         v->height = (hl > hr ? hl : hr) + 1;
  74.     }
  75.  
  76.     node* rotateRight(node* v) {
  77.         node* q = v->left;
  78.  
  79.         v->left = q->right;
  80.         q->right = v;
  81.  
  82.         fixHeight(v); fixHeight(q);
  83.  
  84.         return q;
  85.     }
  86.  
  87.     node* rotateLeft(node* v) {
  88.         node* q = v->right;
  89.  
  90.         v->right = q->left;
  91.         q->left = v;
  92.  
  93.         fixHeight(v); fixHeight(q);
  94.  
  95.         return q;
  96.     }
  97.  
  98.     node* balance(node* v)
  99.     {
  100.         fixHeight(v);
  101.         if (balanceFactor(v) == 2)
  102.         {
  103.             if (balanceFactor(v->right) < 0)
  104.                 v->right = rotateRight(v->right);
  105.             return rotateLeft(v);
  106.         }
  107.         if (balanceFactor(v) == -2)
  108.         {
  109.             if (balanceFactor(v->left) > 0)
  110.                 v->left = rotateLeft(v->left);
  111.             return rotateRight(v);
  112.         }
  113.         return v;
  114.     }
  115.  
  116.     node* root;
  117.  
  118. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement