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

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

Мы решаем ситуацию, окрашивая и v и его родного брата w черный. Если их общий родитель не корень, мы выбираем его цвет к красному. Это может вызвать другую двойную красную проблему в родителе v u, таким образом, мы призываем функцию рекурсивно на u.

/* RBTree E:: */ //вставка (k, x)

Вставка Iterator (константа K& k, константа V& x)

TPos v = вставка (k, x);

если (v == СВ.:: корень ())

setBlack (v);

//вставка в основном дереве

//корень всегда черный

еще

setRed (v);

remedyDoubleRed (v);

возвратите Iterator(v);

//перебаланс в случае необходимости

/* RBTree E:: */ //фиксируют двойной красный z

пустота remedyDoubleRed (константа TPos& z)

TPos v = z.parent ();

если (v == СВ.:: корень () v-> isBlack ()) возвращение;

// // //

v - родитель z v i s кип ack, al l o k z, v двойные красные

если (родной брат (v)-> isBlack ())

v = реструктурируйте (z);

//

Случай 1: реструктуризация

setBlack (v); //главная вершина теперь черный setRed (v.left ()); setRed (v.right ()); //красные дети набора

еще

setBlack (v); setBlack (родной брат (v));

TPos u = v.parent (); если (u == СВ.:: корень ()) возвращение; setRed (u); remedyDoubleRed (u);

//Случай 2: переокраска / / s и v и s i кип i ng кип ack//u является родителем v

//сделайте u красный//, возможно, должен фиксировать u теперь

Кодовый Фрагмент 10.21: функции связали со вставкой для класса RBTree.

вставка функции призывает сервисную функцию вставки, которая была дана в Кодовом Frag-ment 10.10.

Наконец, в Кодовом Фрагменте 10.22, мы представляем внедрение функции удаления для красно-черного дерева. (Мы опустили более простое находящееся в iterator, стирают функцию.) Удаление следует за процессом, обсужденным в Разделе 10.5.1. Мы сначала ищем ключ, который будет удален и производим исключение, если это не найдено. Oth-erwise, мы призываем полезность резинки класса SearchTree, который возвращает положение узла r, который заменил удаленный узел. Если или r или его бывший родитель были красными, мы окрашиваем r черный, и мы сделаны. Иначе, мы сталкиваемся с потенциальной двойной проблемой с темнокожим населением. Мы обращаемся с этим, призывая функцию remedyDoubleBlack.

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

/* RBTree E:: */ //удаляют ключ k вход

пустота стирает (константа K& k) бросок (NonexistentElement)

TPos u = искатель (k, СВ.:: корень ()); //находят узел

если (Iterator (u) == СВ.:: конец ())

бросьте NonexistentElement («Стирают несуществующих»);

TPos r = резинка (u); //удаляют u

если (r == СВ.:: корень () r-> произведенный на свет () wasParentRed (r))

setBlack (r); //фиксируют цветным изменением

еще //r, родитель оба черных

remedyDoubleBlack (r); //fi x делают ubl электронную кипу ack r

/* RBTree E:: */ //fi x делают ubl электронную кипу ack r

пустота remedyDoubleBlack (константа TPos& r)

TPos x = r.parent ();

TPos y = родной брат (r);

если (y-> isBlack ())

если (y.left ()-> произведенный на свет () y.right ()-> произведенный на свет ())

//родитель r//родной брат r

//Случай 1: реструктуризация//z является красным ребенком y

TPos z = (y.left ()-> произведенный на свет ()? y.left (): y.right ());

Окрасьте topColor = x-> цвет ();

z = реструктурируйте (z);

setColor (z, topColor); setBlack (r); setBlack (z.left ()); setBlack (z.right ());

//спасите главный цвет вершины//, реструктурируют x, y, z//дают z спасенный цвет / / s и r кипа ack//темнокожие дети z's набора

еще

setBlack (r); setRed (y);

если (x-> isBlack () &&! (x == СВ.:: корень ()))

remedyDoubleBlack (x);

setBlack (x);

//Случай 2: повторно окрашивая//r=black, y=red

/ / fi x делают ubl электронную кипу ack x

еще

//Случай 3: регулирование

TPos z = (y == x.right ()? y.right (): y.left ());//внук на стороне y

реструктурируйте (z); //реструктурируют x, y, z setBlack (y); setRed (x); //y=black, x=red remedyDoubleBlack (r); //фиксируют r Случаем 1 или 2

Кодовый Фрагмент 10.22: функции связали с удалением для класса RBTree.

функция стирает, призывает сервисную функцию резинки, которая была дана в Кодовом Frag-ment 10.11.