Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

488 Глава 10. Деревья поиска

10.5.2 C ++ внедрение Красно-черного дерева

В этой секции мы обсуждаем C ++ внедрение словаря ADT посредством красно-черного дерева. Интересно отметить, что C ++ Стэндард Темплэйт Ли - brary использует красно-черное дерево в своем внедрении его карты классов и мультикарты. Различие между этими двумя подобно различию между нашей картой и словарем ADTs. Класс карты STL не позволяет записи с, делают дубликаты ключа, тогда как мультикарта STL делает. Есть значительная разница, однако, в поведении вставки карты (k, x), функция и наша карта поместили (k, x) функцию. Если ключ k не присутствует, обе функции вставляют новый вход (k, x) в карте. Если ключ уже присутствует, карта STL просто игнорирует запрос, и текущий вход неизменен. Напротив, наша помещенная функция заменяет существующую стоимость новой стоимостью x. Внедрение, представленное в этой секции, допускает многократные ключи.

Мы представляем главные части внедрения в этой секции. Чтобы сохранять представление кратким, мы опустили внедрения многих более простых сервисных функций.

Мы начинаем, представляя расширенный класс входа, названный RBEntry. Это получено из класса входа Кодового Фрагмента 10.3. Это наследует ключ и участников стоимости, и это определяет членское седло переменной, которое хранит цвет узла. Цвет или КРАСНЫЙ или ЧЕРНЫЙ. Это обеспечивает членские функции для доступа и урегулирования этой стоимости. Эти функции были защищены, таким образом, пользователь не может получить доступ к ним, но RBTree может.

Цвет enumКРАСНЫЙ, ЧЕРНЫЙ; шаблон <typename E> класс RBEntry: общественность E

частный:

Цветное седло; защищенный:

typedef typename E:: Ключ K; typedef typename E:: Стоимость V;

Цветной цвет () константавозвращает седло;

bool isRed () константавозвращает седло == КРАСНЫЙ;bool isBlack () константавозвращают седло == ЧЕРНЫЙ;пустота setColor (Окрашивают c)седло = c;

общественность:

//цвета узла

//красно-черный вход

//цвет узла//местные типы//ключевой тип//тип стоимости//получает цвет

//государственные функции

RBEntry (константа K& k = K (), константа V& v = V ())//конструктор

: E (k, v), седло (ЧЕРНОЕ)

друг класс RBTree <E>; //позволяют доступ RBTree

;

Кодовый Фрагмент 10.19: вход значения ключа для класса RBTree, содержа associ-ated цвет узла.

10.5. Красно-черные деревья 489

В Кодовом Фрагменте 10.20, мы представляем определение класса для RBTree. Декабрь -

laration почти полностью походит на laration AVLTree, за исключением того, что полезность func-tions раньше утверждала, что структура отличается. Мы приняли решение представить только две самых интересных сервисных функции, remedyDoubleRed и remedyDouble-Черного. Значения большинства опущенных утилит легко вывести. (Для экс-вполне достаточный hasTwoExternalChildren (v) определяет, есть ли у узла v два внешних ребенка.)

шаблон <typename E> //красно-черное дерево

класс RBTree: общественный SearchTree <RBEntry <E>>

общественность: //общественные типы

typedef RBEntry <E> RBEntry; //вход

typedef typename SearchTree <RBEntry>:: Iterator Iterator;//iterator

защищенный:

typedef typename RBEntry:: Ключ K; typedef typename RBEntry:: Стоимость V; typedef СИРЧТРИ <РБЕНТРИ>-СТРИТ; typedef typename СВ.:: TPos TPos;

общественность:

RBTree (); вставка Iterator (константа K& k, константа V& x);

//местные типы//ключ//стоимость//дерево поиска//положение дерева//государственные функции//конструктор//вставка (k, x)

пустота стирает (константа K& k) бросок (NonexistentElement);//удаляют ключ k вход

пустота стирает (константа Iterator& p); защищенный:

пустота remedyDoubleRed (константа TPos& z); пустота remedyDoubleBlack (константа TPos& r);//... (другие опущенные утилиты)

;

//удалите вход в p//, сервисные функции//фиксируют двойной красный z / / fi x, делают ubl электронную кипу ack r

Кодовый Фрагмент 10.20: RBTree Класса, который осуществляет словарь ADT использование красно-черного дерева.

Мы сначала обсуждаем внедрение вставки функции (k, x), который дан в Кодовом Фрагменте 10.21. Мы призываем сервисную функцию вставки SearchTree, который возвращает положение вставленного узла. Если этот узел - корень дерева поиска, мы выбираем его цвет черному. Иначе, мы выбираем его цвет к красному и проверяем, необходима ли реструктуризация, призывая remedyDoubleRed.

Эта последняя полезность выполняет необходимые проверки и реструктуризацию представленного в обсуждении вставки в Разделе 10.5.1. Позвольте z обозначить местоположение недавно вставленного узла. Если и z и его родитель красные, мы должны исправить ситуацию. Чтобы сделать так, мы рассматриваем два случая. Позвольте v обозначить родителя z и позволить w быть родным братом v. Если w черный, мы подпадаем под Случай 1 из процедуры обновления вставки. Мы применяем реструктуризацию в z. Главная вершина получающегося поддерева, обозначенного v, установлена в черный, и его два ребенка установлены в красный.

С другой стороны, если w красный, то мы подпадаем под Случай 2 из процедуры обновления.