Введение

Локальное изменение в двоичном дереве, сохраняющее порядок листьев.

В дискретной математике вращение дерева — это операция над двоичным деревом, изменяющая его структуру, не нарушая при этом порядок элементов. Вращение дерева перемещает один узел вверх по дереву, а другой — вниз. Оно используется для изменения формы дерева, и в частности для уменьшения его высоты за счет перемещения меньших поддеревьев вниз и больших — вверх, что приводит к повышению эффективности многих операций с деревом. В различных описаниях существует непоследовательность в определении направления вращения. Одни утверждают, что направление вращения отражает направление движения узла при вращении (например, левый потомок, перемещающийся на место родителя, соответствует правому вращению), в то время как другие считают, что направление вращения отражает, какое поддерево вращается (левое поддерево, перемещающееся на место родителя, соответствует левому вращению, что противоположно предыдущему). В данной статье используется подход, основанный на направлении движения вращающегося узла.

Иллюстрация

Операция поворота вправо, как показано на соседнем изображении, выполняется с Q в качестве корня и, следовательно, является поворотом вправо относительно Q или с корнем в Q. Эта операция приводит к вращению дерева по часовой стрелке. Обратная операция – левое вращение, которое приводит к движению против часовой стрелки (левое вращение, показанное выше, имеет корень в P). Ключ к пониманию принципа работы вращения – понимание его ограничений. В частности, порядок листьев дерева (при чтении слева направо, например) не должен измениться (другой способ рассмотреть это – порядок посещения листьев при обходе дерева в порядке возрастания должен оставаться прежним после операции). Другое ограничение – основное свойство двоичного дерева поиска, а именно, что все узлы в правом поддереве больше родительского узла, а все узлы в левом поддереве меньше родительского узла. Обратите внимание, что правый потомок левого потомка корня поддерева (например, узел B на диаграмме для дерева с корнем в Q) может стать левым потомком корня, который сам становится правым потомком "нового" корня во вращаемом поддереве, не нарушая ни одного из этих ограничений. Как видно на диаграмме, порядок листьев не изменяется. Обратная операция также сохраняет порядок и является вторым типом вращения. Предполагая, что это двоичное дерево поиска, как указано выше, элементы следует интерпретировать как переменные, которые можно сравнивать друг с другом. Буквы латинского алфавита слева используются в качестве заполнителей для этих переменных. В анимации справа заглавные буквы латинского алфавита используются в качестве заполнителей для переменных, а заглавные греческие буквы – в качестве заполнителей для целого набора переменных. Круги представляют отдельные узлы, а треугольники – поддеревья. Каждое поддерево может быть пустым, состоять из одного узла или содержать любое количество узлов.

Ротации для восстановления баланса

Дерево может быть сбалансировано с помощью вращений. После вращения, сторона, вокруг которой выполнено вращение, увеличивает свою высоту на 1, а противоположная сторона уменьшает свою высоту на ту же величину. Таким образом, вращения можно стратегически применять к узлам, у которых разница в высоте между левым и правым потомками превышает 1. Самобалансирующиеся двоичные деревья поиска применяют эту операцию автоматически. Дерево AVL – это один из типов деревьев, использующих эту технику балансировки.

Расстояние вращения

Расстояние вращения между любыми двумя двоичными деревьями с одинаковым количеством узлов — это минимальное количество вращений, необходимое для преобразования одного дерева в другое. При этом расстоянии множество двоичных деревьев с n узлами образует метрическое пространство: расстояние симметрично, положительно для различных деревьев и удовлетворяет неравенству треугольника. Остаётся открытым вопрос о существовании алгоритма, работающего за полиномиальное время, для вычисления расстояния вращения, хотя для некоторых вариантов задачи о расстоянии вращения такие алгоритмы существуют. Дэниел Слейтор, Роберт Тарджан и Уильям Терстон показали, что расстояние вращения между любыми двумя деревьями с n узлами (при n ≥ 11) не превышает 2n − 6, и что некоторые пары деревьев могут находиться на таком максимальном расстоянии, как только n станет достаточно большим. Лайонел Пурнин доказал, что такие пары действительно существуют при n ≥ 11.