Реализация самобалансирующегося бинарного дерева поиска.
Дерево представляет собой связанные между собой структуры
Node<T>. Левое поддерево каждой Node содержит элементы,
большие текущего, а правое - меньшие.
Для типа данных T должна быть определена операция <
Класс Node<T> является приватным в классе AVL.
Создание ноды со значением 42 и родителем parent:
Node* new_node = new Node(42, parent);Node* parent- Указатель на родителя нодыNode* left- Указатель на корень левого поддереваNode* right- Указатель на корень правого поддереваT data- Значение нодыshort diff- Значение разницы высот левого и правого поддерева
Node* head- Указатель на корень дерева
Пустое дерево
AVL<int> a = AVL<int>();Дерево с корнем 3
AVL<int> a = AVL<int>(3);a.add(42);a.remove(42);a.contain(42);a.add(42);
a.contain(42); // true
a.remove(42);
a.contaion(42); // falseПри поптыке удалить несуществующий элемент дерево останется без изменения.
Node* find(T item);При нахождении элемента возвращается указатель на него,
иначе - nullptr.
void small_left_turn(Node* node);
void small_right_turn(Node* node);
void big_left_turn(Node* node);
void big_right_turn(Node* node);Малый левый, малый правый, большой левый и большой правый повороты сооветственно. Используются для балансировки дерева.
Выбор подходящего поворота происходит в функции
bool do_rotation(Node* node);При выполнении поворота возвращает true, иначе false.
Подробнее о поворотах тут.
Используя обозначения из ссылки, можно выписать таблицу
выбора поворота исходя из значений поля diff узлов a и b
| a | b | Поворот |
|---|---|---|
| 2 | +1/0 | small_right_turn |
| 2 | -1 | big_right_turn |
| -2 | 0/-1 | small_left_turn |
| -2 | +1 | big_left_turn |