АВЛ-дерево
Перейти к навигации
Перейти к поиску
class AVLTree { struct Node { int key, height; Node *l, *r; Node(int key) : key(key), height(1), l(0), r(0) {} } *root; int height(const Node *n) const { return n ? n->height : 0; } void updateHeight(Node *n) { if (n) n->height = 1 + max(height(n->l), height(n->r)); } void simpleRotateLeft(Node *&n) { Node *a = n, *b = a->r; a->r = b->l; b->l = a; updateHeight(a); updateHeight(b); n = b; } void simpleRotateRight(Node *&n) { Node *a = n, *b = a->l; a->l = b->r; b->r = a; updateHeight(a); updateHeight(b); n = b; } void doubleRotateLeft(Node *&n) { simpleRotateRight(n->r); simpleRotateLeft(n); } void doubleRotateRight(Node *&n) { simpleRotateLeft(n->l); simpleRotateRight(n); } void rebalance(Node *&n) { if (!n) return; if (height(n->l) - height(n->r) == -2) { if (n->r && height(n->r->l) - height(n->r->r) == +1) doubleRotateLeft(n); else simpleRotateLeft(n); } if (height(n->l) - height(n->r) == +2) { if (n->l && height(n->l->l) - height(n->l->r) == -1) doubleRotateRight(n); else simpleRotateRight(n); } updateHeight(n); } void insert(Node *&n, int key) { if (!n) n = new Node(key); else insert(key < n->key ? n->l : n->r, key); rebalance(n); } void erase(Node *&n, int key) { if (!n) return; if (n->key == key) { if (!n->l || !n->r) { Node *child = (n->l ? n->l : n->r); delete n; n = child; } else { Node *successor = n->r; while (successor->l) successor = successor->l; n->key = successor->key; erase(n->r, successor->key); } } else erase(key < n->key ? n->l : n->r, key); rebalance(n); } public: AVLTree() : root(0) {} int height() const { return height(root); } void insert(int key) { insert(root, key); } void erase(int key) { erase(root, key); } };