На этом шаге мы приведем ряд положений, которыми будем пользоваться при построении дерева.
Красно-чёрное бинарное дерево поиска описательно представим так:
(Корень(Цвет) Левое_поддерево Правое_поддерево).
Для моделирования этого представления в языке Haskell воспользуемся тернарным функтором
(Node root left right),
Таким образом, определение типа данных "целочисленное красно-чёрное бинарное дерево поиска" в языке Haskell, поддерживающего класс типов Eq, над которыми определены отношения равенства, будет таким:
data RBTree = NIL (Char) | Node (Integer,Char) (RBTree) (RBTree) deriving Eq
Узел дерева будем обозначать парой
(Integer,Char),
Внешние узлы дерева (или NIL-узлы) будем обозначать парой
(NIL ('B')),
Пустое дерево состоит из одного внешнего чёрного узла и по определению является красно-чёрным, поэтому обозначим его парой
(NIL ('B')).
Базовые функции лежащие в основе построения красно-чёрного бинарного дерева поиска Tree с NIL-узлами:
root:: RBTree -> (Integer,Char) root tree
left:: RBTree -> RBTree left tree
right:: RBTree -> RBTree right tree
Основные функции для построения красно-чёрных деревьев:
rb_Ins:: RBTree -> Integer -> RBTree rb_Ins tree s
Функция rb_Ins вызывает функцию rb_Ins1
rb_Ins1:: RBTree -> Integer -> RBTree rb_Ins1 tree s
Функция rb_Ins1 анализирует и исправляет нарушения красно-чёрных свойств дерева tree, если таковы имеются, после вставки в него красного узла s с помощью функции addTree:
addTree:: Integer -> Char -> RBTree -> RBTree addTree s color tree
Затем функция rb_Ins перекрашивает корень полученного дерева в чёрный цвет;
rb_Del:: RBTree -> Integer -> RBTree rb_Del tree s
Функция rb_Del анализирует дерево и применяет к нему, если возможно, функцию delete, удаляющую заданный узел s из красно-чёрного дерева tree:
delete:: Integer -> RBTree -> RBTree delete s tree
Если полученное дерево имеет нарушения красно-чёрных свойств, то оно поступает на вход функции rb_Del1:
rb_Del1:: RBTree -> Integer -> RBTree rb_Del1 tree x
Функция rb_Del1 восстанавливает красно-чёрные свойства дерева.
Вспомогательные предикаты для реализации основных функций:
srch:: Integer -> RBTree -> Bool srch s tree
pSrch_G:: Integer -> RBTree -> Bool pSrch_G s tree
pSrch_D:: Integer -> RBTree -> Bool pSrch_D s tree
pSrch_B:: Integer -> RBTree -> Bool pSrch_B s tree
pSrch_Nl:: Integer -> RBTree -> Bool pSrch_Nl s tree
pSrch_Nr:: Integer -> RBTree -> Bool pSrch_Nr s tree
pSrch_U:: Integer -> RBTree -> Bool pSrch_U s tree
Вспомогательные функции для реализации основных функций:
search:: Integer -> RBTree -> RBTree search s tree
srch_G:: Integer -> RBTree -> (Integer,Char) srch_G s tree
srch_D:: Integer -> RBTree -> (Integer,Char) srch_D s tree
srch_B:: Integer -> RBTree -> (Integer,Char) srch_B s tree
srch_Nl:: Integer -> RBTree -> (Integer,Char) srch_Nl s tree
srch_Nr:: Integer -> RBTree -> (Integer,Char) srch_Nr s tree
srch_U:: Integer -> RBTree -> (Integer,Char) srch_U s tree
subst:: RBTree -> (Integer,Char) -> (Integer,Char) -> RBTree subst tree a b
chng_Clr:: RBTree -> Integer -> Char -> RBTree chng_Clr tree v clr_V
rot_Right:: RBTree -> RBTree rot_Right tree
rot_Left:: RBTree -> RBTree rot_Left tree
rotInTree:: Integer -> RBTree -> RBTree rotInTree s tree
outTree:: RBTree -> IO() outTree tree
drawTree:: RBTree -> Int -> String drawTree tree l
На следующем шаге мы рассмотрим демонстрационные примеры.