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

10.3. Косые деревья 451

зигзаг: Один из x и y - покинутый ребенок, и другой правильный ребенок. (См. Фигу -

ure 10.14.) В этом случае, мы заменяем z x и заставляем x иметь y и z как его дети, поддерживая inorder отношения узлов в T.

(a) (b)

Рисунок 10.14: зигзаг: (a) прежде; (b) после. Есть другой симметричный configura-tion, где x - правильный ребенок, и y - покинутый ребенок.

крутой поворот: у x нет прародителя (или мы не рассматриваем прародителя x для

некоторая причина). (См. рисунок 10.15.) В этом случае, мы вращаем x по y, заставляя детей x быть узлом y и одним из бывших детей x w, чтобы поддерживать относительные inorder отношения узлов в T.

(a) (b)

Рисунок 10.15: Крутой поворот: (a) прежде; (b) после. Есть другая симметричная конфигурация, где x и w оставляют детей.

Мы выполняем крутой поворот крутого поворота или зигзаг, когда у x есть прародитель, и мы выполняем крутой поворот, когда у x есть родитель, но не прародитель. Шаг вывиха состоит из повторения этих restructurings в x, пока x не становится корнем T. Обратите внимание на то, что это не то же самое как последовательность простых вращений, которая приносит x к корню. Примеру вывиха узла показывают 10.16 в цифрах и 10.17.

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

(a)

(b)

(c)

Рисунок 10.16: Пример вывиха узла: (a) вывих узла, снабжающего 14 запусков зигзагом; (b) после зигзага; (c) следующий шаг крутой поворот крутого поворота. (Продолжается в рисунке 10.17.)

10.3. Косые деревья 453

(d)

(e)

(f)

Рисунок 10.17: Пример вывиха узла: (d) после крутого поворота крутого поворота; (e) следующий шаг снова крутой поворот крутого поворота; (f) после крутого поворота крутого поворота (Продолженный от рисунка 10.17.)

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

10.3.2 Когда вывихнуть

Правила, которые диктуют, когда вывих выполнен, следующие:

• Ища ключ k, если k найден в узле x, мы вывихиваем x, еще мы вывихиваем

родитель внешнего узла, в котором поиск заканчивается неудачно.

Например, вывихивающие 10.16 в цифрах и 10.17 были бы выполнены после поиска успешно ключевых 14 или неудачно ключевых 14.5.

• Вставляя ключ k, мы вывихиваем недавно созданный внутренний узел где k

вставлен. Например, вывихивающие 10.16 в цифрах и 10.17 были бы

будьте выполнены, если 14 был недавно вставленный ключ. Мы показываем последовательность вставок в косом дереве в рисунке 10.18.

(a) (b) (c)

(d) (e) (f)

(g)

Рисунок 10.18: последовательность вставок в косом дереве: (a) начальное дерево; (b) после вставки 2; (c) после вывиха; (d) после вставки 3; (e) после вывиха; (f) после вставки 4; (g) после вывиха.