На этом шаге мы рассмотрим AA-деревья.
левый дочерний узел не может быть красным.
Введённое ограничение существенно упрощает алгоритмы для работы с красно-чёрными деревьями по двум причинам:
Именно, если у внутреннего узла имеется только один дочерний узел, он должен быть правым красным дочерним узлом, потому что левые красные дочерние узлы теперь запрещены, а один чёрный дочерний узел нарушит свойство (4) красно-чёрных деревьев (каждый путь от узла до NULL-указателя должен содержать одно и то же число чёрных узлов). В результате мы всегда можем заменить внутренний узел наименьшим узлом из его правого поддерева. Этот наименьший узел будет либо листом, либо красным дочерним узлом, и его легко обойти и удалить.
Для реализации представим информацию о сбалансированности другим способом. Вместо того, чтобы хранить цвет каждого узла, мы будем сохранять уровень узла.
Уровень узла представляет собой число левых связей на пути к сигнальному узлу nullNode (напомним, что вместо NULL-указателя мы используем узел nullNode; этот узел всегда будет чёрным) и может быть:
Результатом будет AA-дерево.
При преобразовании структурных требований из цветов в уровни мы знаем, что левый дочерний узел должен быть на один уровень ниже, чем его родитель (но не более).
Горизонтальная связь - это соединение между узлом и дочерним узлом с одинаковыми уровнями. Цветовые свойства подразумевают следующее:
Поиск в AA-дереве осуществляется с помощью обычного алгоритма.
Повороты дерева решают все возникающие проблемы.
На следующем шаге мы рассмотрим несколько демонстрационных примеров.