Довідка та теорія
AVL-дерево (Адельсон-Вельський і Ландіс, 1962) — це
найперше самобалансувальне двійкове дерево пошуку. Воно
зберігає баланс висоти після кожної вставки й видалення,
гарантуючи пошук, вставку та видалення за
O(log n) у найгіршому випадку.
Фактор балансу
Кожен вузол зберігає фактор балансу:
висота(лівого) − висота(правого). Інваріант AVL
вимагає, щоб це значення завжди залишалося в межах
{−1, 0, 1} для кожного вузла. Після зміни
висоти перераховуються знизу вгору, від зміненого вузла до
кореня.
Виявлення дисбалансу
Рухаючись вгору, перший предок, чий фактор балансу виходить
за межі {−1,0,1}, стає точкою повороту.
Чотири випадки повороту
LL: перевантажене ліве піддерево, лівий нащадок теж лівий — одинарний правий поворот.RR: перевантажене праве піддерево, правий нащадок теж правий — одинарний лівий поворот.LR: перевантажене ліве піддерево, лівий нащадок правий — спочатку поворот лівого нащадка ліворуч, потім вузла праворуч.RL: перевантажене праве піддерево, правий нащадок лівий — спочатку поворот правого нащадка праворуч, потім вузла ліворуч.
Кожен поворот — це перезапис покажчиків за O(1); після вставки потрібен щонайбільше один (одинарний чи подвійний) поворот, тоді як видалення може вимагати поворотів на кожному рівні аж до кореня.
Чому це важливо
Незбалансоване звичайне ДДП вироджується до
O(n) на відсортованих вхідних даних (стає
зв'язаним списком). Суворий баланс AVL утримує висоту на
рівні O(log n) ≈ 1.44·log₂(n+2), тож пошук
залишається швидким незалежно від порядку вставки.