AVL-дерево
BST, которое само себя балансирует: высота всегда O(log n).
1class AVLNode {2 value: number3 left: AVLNode | null = null4 right: AVLNode | null = null5 height = 16 7 balance(): number {8 return h(this.right) - h(this.left)9 }10}11 12function insert(node: AVLNode | null, v: number): AVLNode {13 if (node === null) return new AVLNode(v)14 if (v < node.value) node.left = insert(node.left, v)15 else node.right = insert(node.right, v)16 17 node.height = 1 + Math.max(h(node.left), h(node.right))18 19 const b = node.balance()20 if (b < -1 && v < node.left!.value) return rotateRight(node) // LL21 if (b > 1 && v > node.right!.value) return rotateLeft(node) // RR22 if (b < -1) { node.left = rotateLeft(node.left!); return rotateRight(node) } // LR23 if (b > 1) { node.right = rotateRight(node.right!); return rotateLeft(node) } // RL24 25 return node26}Проблема
BST, которое само себя балансирует: высота всегда O(log n).
Что вы видите
Баланс каждого узла ∈ [−1, 1]; нарушение — поворот LL/RR/LR/RL.
Как это работает
Высота ≤ 1.44·log₂(n) — гарантия. Вставка/удаление с O(log n) поворотами. Строгость баланса = быстрее поиск, дороже вставка (vs красно-чёрные).
Пошаговый разбор
- 01
Баланс
h(R) − h(L).
- 02
LL/RR
Один поворот.
- 03
LR/RL
Два поворота.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
std::map
Красно-чёрные родственники.
БД
Индексы в памяти.
Словари
Гарантия log n.
Связанные алгоритмы
«Дерево, которое не вытягивается в список»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.