На этом шаге мы рассмотрим еще один однократный поворот.
Этот алгоритм ничем не отличается от рассмотренного на предыдущем шаге, только поворот осуществляется в другую сторону.
Приведем текст алгоритма:
p1 = (*p).Right; (*p).Right = (*p1).Left; (*p1).Left = p; (*p).bal = 0; p = p1;
Рассмотрим его использование на конкретном примере.
Пусть дано следующее дерево:
Рис.1. Исходное дерево
Иллюстрируем алгоритм с помощью схем "до и после" Д.Кнута:
p1 = (*p).Right;
Рис.2. Сохранение адреса нового корня дерева
(*p).Right = (*p1).Left;
Рис.3. Переприкрепление
(*p1).Left = p;
Рис.4. Определение левого поддерева "нового" корня
(*p).bal = 0; p = p1;
Рис.5. Установка начальных значений
В результате получилось следующее сбалансированное дерево:
Рис.6. Результат балансировки
Проиллюстрируем эту несбалансированность и ее устранение следующими рисунками:
Рис.7. Несбалансированность (отмечен узел, вызвавший несбалансированность)
Рис.8. Несбалансированность устранена (отмечен узел, вызвавший несбалансированность)
Со следующего шага мы начнем рассматривать двухкратные повороты.