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