Шаг 166.
Основы языка Haskell. Рекурсивные типы данных. Красно-чёрные деревья, AA-деревья. Общие сведения об AA-деревьях

    На этом шаге мы рассмотрим AA-деревья.

Определение (по [1, с. 660-661]).
AA-дерево - это сбалансированное дерево, которое добавляет к определению красно-чёрного дерева дополнительное условие:
  левый дочерний узел не может быть красным.

    Введённое ограничение существенно упрощает алгоритмы для работы с красно-чёрными деревьями по двум причинам:

    Именно, если у внутреннего узла имеется только один дочерний узел, он должен быть правым красным дочерним узлом, потому что левые красные дочерние узлы теперь запрещены, а один чёрный дочерний узел нарушит свойство (4) красно-чёрных деревьев (каждый путь от узла до NULL-указателя должен содержать одно и то же число чёрных узлов). В результате мы всегда можем заменить внутренний узел наименьшим узлом из его правого поддерева. Этот наименьший узел будет либо листом, либо красным дочерним узлом, и его легко обойти и удалить.

    Для реализации представим информацию о сбалансированности другим способом. Вместо того, чтобы хранить цвет каждого узла, мы будем сохранять уровень узла.

    Уровень узла представляет собой число левых связей на пути к сигнальному узлу nullNode (напомним, что вместо NULL-указателя мы используем узел nullNode; этот узел всегда будет чёрным) и может быть:

    Результатом будет AA-дерево.

    При преобразовании структурных требований из цветов в уровни мы знаем, что левый дочерний узел должен быть на один уровень ниже, чем его родитель (но не более).

    Горизонтальная связь - это соединение между узлом и дочерним узлом с одинаковыми уровнями. Цветовые свойства подразумевают следующее:

    Поиск в AA-дереве осуществляется с помощью обычного алгоритма.

    Повороты дерева решают все возникающие проблемы.


   Замечание (по [1, с. 669]). AA-деревья используются для эффективной реализации классов set и map из библиотеки STL.

(1)Уайс М.А. Организация структур данных и решение задач на C++. - М.: ЭКОМ Паблишерз, 2008. - 896 с.

    На следующем шаге мы рассмотрим несколько демонстрационных примеров.




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