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

10.2. Деревья avl 449

проверки, уравновешен ли z. В противном случае это находит самого высокого внука z и применяется

реструктуризация операции к этому узлу. Так как высоты, возможно, изменились в результате, это обновляет информацию о высоте для детей z и его.

/* AVLTree E:: */ //повторно балансирующая полезность

недействительный перебаланс (константа TPos& v)

TPos z = v;

в то время как (! (z == СВ.:: корень ()))

z = z.parent ();

setHeight (z);

//повторно балансируйте, чтобы укорениться

//вычислите новую высоту

если (! isBalanced (z))

TPos x = tallGrandchild (z);

z = реструктурируйте (x); setHeight (z.left ()); setHeight (z.right ()); setHeight (z);

//реструктуризация необходима

//trinode реструктурируют//высоты обновления



Кодовый Фрагмент 10.17: перебалансирование дерева после операции по обновлению.

Наконец, в Кодовом Фрагменте 10.18, мы представляем функции для вставки и стирания ключей. (Мы опустили находящееся в iterator, стирают функцию, так как это очень просто.) Каждый призывает связанную сервисную функцию (вставка или резинка, respec-tively) от базового класса SearchTree. Каждый тогда призывает перебаланс, чтобы вернуть баланс дереву.

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

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

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

setHeight (v); перебаланс (v); возвратите Iterator(v);

/* AVLTree E:: */

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

//удалите ключ k вход

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

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

если (Iterator(v) == СВ.:: конец ()) //не найденный?

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

TPos w = резинка (v); //удаляют его перебаланс (w); //повторно балансируют в случае необходимости

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

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

10.3 Косые Деревья

Иначе мы можем осуществить фундаментальные операции по карте, должен использовать шахту - anced структура данных дерева поиска, известная как косое дерево. Эта структура - conceptu-союзник, очень отличающийся от других уравновешенных деревьев поиска, которые мы обсуждаем в этой главе, поскольку косое дерево не использует явных правил провести в жизнь его баланс. Вместо этого это, AP - сгибает определенную операцию движения к корню, названную вывихом, после каждого доступа, чтобы сохранять дерево поиска уравновешенным в амортизируемом смысле. Операция по вывиху выполнена в самом нижнем узле x достигнутый во время вставки, удаления, или даже поиска. Удивительная вещь о вывихе состоит в том, что он позволяет нам гарантировать амортизируемую продолжительность для вставок, удалений и поисков, который является логарифмическим. Структура косого дерева - просто дерево двоичного поиска T. Фактически, нет никакой дополнительной высоты, баланса или цветных этикеток, которые мы связываем с узлами этого дерева.

10.3.1 Вывих

Учитывая внутренний узел x дерева двоичного поиска T, мы вывихиваем x, двигаясь x к

корень T через последовательность restructurings. Особые restructurings, которые мы выполняем, важны, поскольку это не достаточно, чтобы переместить x в корень T просто любой последовательностью restructurings. Определенная операция, которую мы выполняем, чтобы переместить x вверх, зависит от относительных положений x, его родительского y, и (если это существует), прародитель x z. Есть три случая, которые мы рассматриваем. крутой поворот крутого поворота: узлу x и его родительскому y оба оставляют детей или обоих правильных детей.

(См. рисунок 10.13.) Мы заменяем z x, делая y ребенка x и z ребенком y, поддерживая inorder отношения узлов в T.

(a) (b)

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