Изменения

Перейти к: навигация, поиск

АВЛ-дерево с O(1) бит в каждом узле

Нет изменений в размере, 01:27, 6 июня 2015
Нет описания правки
=== Идея ===
В обычной реализации АВЛ-дерева[http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%92%D0%9B-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE] в каждом узле мы хранили высоту этого узла. Так как высоты левых и правых поддеревьев в АВЛ-дереве отличаются максимум на <tex>1</tex>, то мы будем хранить не всю высоту дерева, а некоторое число, которое будет показывать разницу между высотами его правой и левой ветки - назовём его ''фактор баланса''. Таким образом в каждом узле будет хранится <tex>1</tex> - если высота правого поддерева выше левого, <tex>0</tex> - если высоты равны, и <tex>-1</tex> - если правое поддерево выше левого.
 
=== Операции ===
=== Балансировка ===
Опишем операции балансировки, а именно малый левый поворот, большой левый поворот и случаи их возникновения. Балансировка нам нужна для операций добавления и удаления узла. Для исправления факторов баланса, достаточно знать факторы баланса двух(в случае большого поворота-трех) вершин перед поворотом, и исправить значения этих же вершин после поворота. Обозначим фактор баланса вершины <tex>i</tex> как <tex>balance[i]</tex>. Операции поворота делаются на том шаге, когда мы находимся в правом сыне вершины <tex>a</tex>, если мы производим операцию добавления, и в левом сыне, если мы производим операцию удаления. Вычисления производим заранее, чтобы не допустить значения <tex>2</tex> или <tex>-2</tex> в вершине <tex>a</tex>.
 
{| border="1" cellpadding="5" cellspacing="0"
!Тип вращения
21
правка

Навигация