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

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

    Опишем реализацию АТД "Красно-чёрные деревья" на языке C.

    Для красно-чёрных деревьев в каждом узле необходимо хранить:

    Для хранения цвета достаточно одного бита (однако из-за необходимости "выравнивания" структур, требуемого для эффективности доступа, как правило, будет потрачено больше памяти).

    Таким образом, каждый узел красно-чёрного дерева требует памяти для размещения 4-х указателей.


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

    Все листья дерева являются "сторожевыми", что значительно упрощает коды обработки граничных условий: вместо NIL используется  фиктивный элемент (англ. sentinal).

    Для красно-чёрного дерева T фиктивный элемент nil(T) имеет те же поля, что и обычный узел дерева; его цвет чёрный, а остальным полям (left, right, parent, data) могут быть присвоены любые значения.

    Будем считать, что в красно-чёрном дереве все указатели NIL заменены на nil(T).

    Благодаря фиктивным элементам можно считать NIL-лист, являющийся ребёнком вершины x, обычной вершиной, родитель которой есть x.

    Узел root является корнем дерева и в самом начале является "сторожевым". Основные функции АТД "Красно-чёрные деревья" таковы:

    Приведем текст приложения.

Раскрыть/скрыть текст приложения.

    На следующем шаге мы рассмотрим AA-деревья.




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