Шаг 157.
Основы языка Haskell. Рекурсивные типы данных. Красно-чёрные деревья, AA-деревья. Алгоритм включения узла в красно-чёрное дерево

    На этом шаге мы рассмотрим различные варианты этого алгоритма.

    Будем исходить из того, что:

    Теперь для сохранения свойства чёрного узла будем включать красный узел в лист, а затем исправлять нарушение свойства красного узла (если оно возникнет).

    Процесс исправления нарушений свойств красно-чёрного дерева будет повторяться по пути, ведущему от нового узла к корню дерева.

    Рассмотрим случаи, которые могут возникнуть, если отец включаемого узла S имеет красный цвет.

    1.  Ситуация "красный отец,  чёрный дядя ".

    (а) D - левый потомок G; S - левый потомок D:

    Исправим нарушение свойства красного узла так:

    (б) D - левый потомок узла G; S - правый потомок узла D:

    Исправим нарушение свойства красного узла так:


   Замечание (важное для уменьшения количества операций). Можно свести рассматриваемый случай к случаю (а):

    (1) осуществив левую ротацию узла S:

    (2) поменяв местами метки вершин S и G:

    (3) выполним правую ротацию узла G:


    (в) зеркальное отражение случая (a): D - правый потомок G; S - правый потомок D:

    Исправим нарушение свойства красного узла так:

    (г) зеркальное отражение случая (б): D - правый потомок G; S - левый потомок D:

    Исправим нарушение свойства красного узла так:


   Замечание (важное для уменьшения количества операций). Можно свести рассматриваемый случай к случаю (в):

    На следующем шаге мы закончим рассмотрение этого вопроса.




Предыдущий шаг Содержание Следующий шаг