Advertisement
MKcrazy8

Untitled

Dec 21st, 2022 (edited)
808
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.87 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3.  
  4. struct Node {
  5.     int value, height_ = 1;
  6.     Node *left_, *right_;
  7.  
  8.     explicit Node(int val) {
  9.         value = val;
  10.         left_ = nullptr;
  11.         right_ = nullptr;
  12.         height_ = 1;
  13.     }
  14.  
  15.     int balanceFactor() const {
  16.         int left_height = left_ ? left_->getHeight() : 0;
  17.         int right_height = right_ ? right_->getHeight() : 0;
  18.         return right_height - left_height;
  19.     }
  20.  
  21.     int getHeight() {
  22.         if (!left_) {
  23.             if (!right_) {
  24.                 height_ = 1;
  25.             } else {
  26.                 height_ = right_->getHeight() + 1;
  27.             }
  28.         } else {
  29.             if (!right_) {
  30.                 height_ = left_->getHeight() + 1;
  31.             } else {
  32.                 height_ = std::max(left_->getHeight(), right_->getHeight()) + 1;
  33.             }
  34.         }
  35.         return height_;
  36.     }
  37.  
  38.     ~Node() = default;
  39. };
  40.  
  41. class AVLTree {
  42. public:
  43.     Node *root_;
  44.     int size_;
  45.  
  46.     AVLTree() {
  47.         root_ = nullptr;
  48.         size_ = 0;
  49.     }
  50.  
  51.     ~AVLTree() {
  52.         deleteAvl(root_);
  53.     }
  54.  
  55.     void deleteAvl(Node *p) {
  56.         if (p) {
  57.             deleteAvl(p->left_);
  58.             deleteAvl(p->right_);
  59.             delete p;
  60.         }
  61.     }
  62.  
  63.     int *traversal() {
  64.         int x = 1;
  65.         int *y = reinterpret_cast<int *>(x);
  66.         return y;
  67.     }
  68.  
  69.     int *lowerBound(int value) {
  70.         int x = 1;
  71.         int *y = reinterpret_cast<int *>(x);
  72.         return y;
  73.     }
  74.  
  75.     int getHeight() {
  76.         return root_ ? root_->getHeight() : 0;
  77.     }
  78.  
  79.     void insert(int value) {
  80.         if (!find(value)) {
  81.             insert(value, root_);
  82.             ++size_;
  83.         }
  84.     }
  85.  
  86.     void insert(int value, Node *&node) {
  87.         if (!node) {
  88.             node = new Node(value);
  89.         } else if (value < node->value) {
  90.             insert(value, node->left_);
  91.         } else if (value > node->value) {
  92.             insert(value, node->right_);
  93.         }
  94.         node = balance(node);
  95.     }
  96.  
  97.     int *find(int value) {
  98.         return root_ ? find(value, root_) : nullptr;
  99.     }
  100.  
  101.     int *find(int value, Node *node) {
  102.         if (!node) {
  103.             return nullptr;
  104.         } else if (node->value > value) {
  105.             return find(value, node->left_);
  106.         } else if (node->value < value) {
  107.             return find(value, node->right_);
  108.         } else {
  109.             return &node->value;
  110.         }
  111.     }
  112.  
  113.     void erase(int value) {
  114.         if (find(value)) {
  115.             root_ = erase(root_, value);
  116.             --size_;
  117.         }
  118.     }
  119.  
  120.     Node *erase(Node *node, int value) {
  121.         if (!node) {
  122.             return nullptr;
  123.         } else if (node->value > value) {
  124.             node->left_ = erase(node->left_, value);
  125.         } else if (node->value < value) {
  126.             node->right_ = erase(node->right_, value);
  127.         } else {
  128.             Node *root_left = node->left_;
  129.             Node *root_right = node->right_;
  130.             delete node;
  131.             if (!root_right) {
  132.                 return root_left;
  133.             }
  134.             Node *new_node = findMin(root_right);
  135.             new_node->right_ = removeMin(root_right);
  136.             new_node->left_ = root_left;
  137.         }
  138.         return balance(node);
  139.     }
  140.  
  141.     static Node *rotateRight(Node *node) {
  142.         auto new_node = node->left_;
  143.         node->left_ = new_node->right_;
  144.         new_node->right_ = node;
  145.         node->getHeight();
  146.         new_node->getHeight();
  147.         return new_node;
  148.     }
  149.  
  150.     static Node *rotateLeft(Node *node) {
  151.         auto new_node = node->right_;
  152.         node->right_ = new_node->left_;
  153.         new_node->left_ = node;
  154.         node->getHeight();
  155.         new_node->getHeight();
  156.         return new_node;
  157.     }
  158.  
  159.     Node *balance(Node *node) {
  160.         node->getHeight();
  161.         if (node->balanceFactor() == 2) {
  162.             if (node->right_->balanceFactor() == -1) {
  163.                 node->right_ = rotateRight(node->right_);
  164.             }
  165.             return rotateLeft(node);
  166.         }
  167.         if (node->balanceFactor() == -2) {
  168.             if (node->right_->balanceFactor() == 1) {
  169.                 node->left_ = rotateLeft(node->left_);
  170.             }
  171.             return rotateRight(node);
  172.         }
  173.         return node;
  174.     }
  175.  
  176.     Node *findMin(Node *node) {
  177.         if (node) {
  178.             return node->left_ ? findMin(node->left_) : node;
  179.         }
  180.         return nullptr;
  181.     }
  182.  
  183.     Node *removeMin(Node *node) {
  184.         if (!node) {
  185.             return nullptr;
  186.         }
  187.         if (!node->left_) {
  188.             return node->right_;
  189.         }
  190.         node->left_ = removeMin(node->left_);
  191.         return balance(node);
  192.     }
  193.  
  194.     bool empty() {
  195.         return size_ == 0;
  196.     }
  197.  
  198.     Node *getRoot() {
  199.         return root_;
  200.     }
  201.  
  202.     int getSize() const {
  203.         return size_;
  204.     }
  205. };
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement