Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <SFML/Graphics.hpp>
- #include<iostream>
- #include<string>
- #include<cstdlib>
- #include<conio.h>
- #include<vector>
- #include<iomanip>
- using namespace sf;
- struct node {
- int key;
- uint8_t height;
- node* left;
- node* right;
- node(int k, node* leftC = nullptr, node* rightC = nullptr) :
- key(k), left(leftC), right(rightC), height(1) {}
- };
- class AVL_Tree {
- public:
- AVL_Tree(node* _root) : root(_root) {}
- node* insert(int k)
- {
- root = insert(root, k);
- }
- void search(int k) {
- root = find(root, k);
- }
- private:
- node* find(node* v, int k) {
- if (v == nullptr)
- return nullptr;
- else if (k < v->key) {
- return find(v->left, k);
- }
- else if (k > v->key) {
- return find(v->right, k);
- }
- else
- return v;
- }
- node* insert(node* v, int k) // вставка ключа k в дерево с корнем p
- {
- if (!v) return new node(k);
- if (k < v->key)
- v->left = insert(v->left, k);
- else
- v->right = insert(v->right, k);
- return balance(v);
- }
- uint8_t getHeight(node* v) {
- return (v ? v->height : 0);
- }
- int balanceFactor(node* v) {
- return getHeight(v->right) - getHeight(v->left);
- }
- void fixHeight(node* v) {
- uint8_t hl = getHeight(v->left);
- uint8_t hr = getHeight(v->right);
- v->height = (hl > hr ? hl : hr) + 1;
- }
- node* rotateRight(node* v) {
- node* q = v->left;
- v->left = q->right;
- q->right = v;
- fixHeight(v); fixHeight(q);
- return q;
- }
- node* rotateLeft(node* v) {
- node* q = v->right;
- v->right = q->left;
- q->left = v;
- fixHeight(v); fixHeight(q);
- return q;
- }
- node* balance(node* v)
- {
- fixHeight(v);
- if (balanceFactor(v) == 2)
- {
- if (balanceFactor(v->right) < 0)
- v->right = rotateRight(v->right);
- return rotateLeft(v);
- }
- if (balanceFactor(v) == -2)
- {
- if (balanceFactor(v->left) > 0)
- v->left = rotateLeft(v->left);
- return rotateRight(v);
- }
- return v;
- }
- node* root;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement