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

10.2. Деревья avl 441

операция insertAtExternal на T, высотах некоторых узлов T, включая w,

увеличение. Все такие узлы находятся на пути T от w до корня T, и это единственные узлы T, который, возможно, просто стал неуравновешенным. (См. рисунок 10.9 (a).), Конечно, если это происходит, то T больше не дерево AVL; следовательно, нам нужен механизм, чтобы фиксировать «отсутствие равновесия», которое мы только что вызвали.

Рисунок 10.9: вставка в качестве примера входа с ключевыми 54 в дереве AVL рисунка 10.8: (a) после добавления нового узла для ключевых 54, узлы, хранящие ключи 78 и 44, становятся неуравновешенными; (b) реструктуризация trinode восстанавливает собственность баланса высоты. Мы показываем высоты узлов рядом с ними, и мы определяем узлы x, y, и z, участвующий в реструктуризации trinode.

Мы восстанавливаем баланс узлов в дереве двоичного поиска T простой стратегией «поиска-и-ремонта». В частности позвольте z быть первым узлом, с которым мы сталкиваемся в движении - луг от w к корню T, таким образом, что z выведен из равновесия. (См. рисунок 10.9 (a).) Кроме того, позвольте y обозначить ребенка z с более высокой высотой (и обратите внимание на то, что узел y должен быть предком w). Наконец, позвольте x быть ребенком y с более высокой высотой (не может быть связи, и узел x должен быть предком w). Кроме того, узел x является внуком z и мог быть равен w. Так как z стал неуравновешенным из-за вставки в поддереве, внедренном в его ребенке y, высота y равняется 2 больше, чем его родной брат.

Мы теперь повторно уравновешиваем поддерево, внедренное в z, называя trinode restructur-функцией луга, реструктурируем (x), данный в Кодовом Фрагменте 10.12 и иллюстрированный в Фиге - ures 10.9 и 10.10. trinode, реструктурирующий временно, переименовывает узлы x, y, и z как a, b, и c, так, чтобы предшествование b и b предшествовали c в inorder пересечении T. Есть четыре возможных способа нанести на карту x, y, и z к a, b, и c, как показано в рисунке 10.10, которые объединены в один случай нашей перемаркировкой. trinode, реструктурирующий тогда, заменяет z узлом, названным b, заставляет детей этого узла быть a и c, и заставляет детей a и c быть четырьмя предыдущими детьми x, y, и z (кроме x и y), поддерживая inorder отношения всех узлов в T.

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

Алгоритм реструктурирует (x):

Вход: узел x дерева двоичного поиска T, у которого есть и родительский y и великое -

родительский z

Продукция: Дерево T после trinode, реструктурирующего (который соответствует синглу или

двойное вращение) вовлечение узлов x, y, и z

1: Позвольте (a, b, c) быть слева направо (inorder) список узлов x, y, и z, и позволить

(T0, T1, T2, T3) быть слева направо (inorder) список четырех поддеревьев x, y, и z, не внедренный в x, y, или z.

2: Замените поддерево, внедренное в z с новым поддеревом, внедренным в b. 3: Позвольте быть покинутым ребенком b и позволить T0 и T1 быть левыми и правыми поддеревьями a,

соответственно.

4: Позвольте c быть правильным ребенком b и позволить T2 и T3 быть левыми и правыми поддеревьями c,

соответственно.

Кодовый Фрагмент 10.12: trinode реструктуризация операции в дереве двоичного поиска.

Модификация дерева T вызванный trinode, реструктуризацию операции часто называют вращением из-за геометрического способа, которым мы можем визуализировать способ, которым это изменяет T. Если b = y, trinode, реструктуризацию метода называют единственным вращением, для него может визуализироваться как «вращающийся» y по z. (См. рисунок 10.10 (a) и (b).) Иначе, если b = x, trinode реструктуризацию операции называют двойным вращением для него, может визуализироваться как сначала «вращающийся» x по y и затем по z. (См. рисунок 10.10 (c) и (d) и рисунок 10.9.) Некоторые компьютерные исследователи рассматривают эти два вида вращений как отдельные методы, каждый с двумя симметричными типами. Мы приняли решение, однако, объединить эти четыре типа вращений в единственный trinode реструктуризация операции. Независимо от того, как мы рассматриваем его, тем не менее, trinode, реструктуризация метода изменяет отношения отцов и детей O (1) узлы в T, сохраняя inorder пересекающийся заказ всех узлов в T.

В дополнение к его сохраняющей заказ собственности, trinode реструктурирующие изменения высоты нескольких узлов в T, чтобы восстановить баланс. Вспомните, что мы выполняем функцию, реструктурируют (x), потому что z, прародитель x, выведен из равновесия. Кроме того, это отсутствие равновесия происходит из-за одного из детей x, теперь имеющего слишком большую высоту относительно высоты другого ребенка z. В результате вращения мы перемещаем «высокого» ребенка вверх x, отталкивая «короткого» ребенка z. Таким образом, после выполнения реструктурируют (x), все узлы в поддереве, теперь внедренном в узле, который мы назвали, b уравновешены. (См. рисунок 10.10.) Таким образом мы восстанавливаем собственность баланса высоты в местном масштабе в узлах x, y, и z. Кроме того, так как после выполнения новой вставки входа поддерево, внедренное в b, заменяет один раньше внедренный в z, который был более высоким одной единицей, все предки z, которые были раньше выведены из равновесия, становятся уравновешенными. (См. рисунок 10.9.) (Оправдание этого факта оставляют как Упражнение C-10.14.) Поэтому, эта реструктуризация также восстанавливает собственность баланса высоты глобально.