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

10.1. Деревья двоичного поиска 437

Наконец, мы представляем функции удаления в Кодовом Фрагменте 10.11. Мы imple-

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

/* SearchTree E:: */

Резинка TPos (TPos& v)

TPos w;

если (v.left () .isExternal ()) w = v.left (); еще, если (v.right () .isExternal ()) w = v.right ();

еще

w = v.right ();

сделайтеw = w.left ();, в то время как (w.isInternal ());

TPos u = w.parent ();

//удалите полезность

//удалите из левого//, удаляют из права//оба внутренние?//идут в правильное поддерево//, получают крайний левый узел

v-> setKey (u-> ключ ()); v-> setValue (u-> стоимость ());//копируют родителя w к v

n-; //один меньше входа

возвратите T.removeAboveExternal (w); //удаляют w и родителя

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

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

TPos v = искатель (k, корень ()); //ищут от виртуального корня

если (v.isExternal ()) //не найденный?

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

резинка (v); //удаляют его

/* SearchTree E:: */ //стирают вход в p

пустота стирает (константа Iterator& p)

резинка (p.v);

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

Обновляя записи узла (во вставке и резинке), мы явно изменяем только ключ и стоимость (использующий setKey и setValue). Вы могли бы задаться вопросом, что еще должно там измениться? Позже в этой главе, мы представляем структуры данных, которые основаны на изменении класса Входа. Важно, чтобы только ключ и данные о стоимости были изменены, копируя узлы для этих структур.

Наше внедрение сосредоточилось на главных элементах внедрения дерева двоичного поиска. Есть еще несколько вещей, которые, возможно, были включены. Это - прямое осуществление, чтобы осуществить операцию по словарю findAll. Также стоило бы осуществить оператора декремента (» - «), который перемещает iterator к его inorder предшественнику.

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

10.2 Деревья AVL

В предыдущей секции мы обсудили то, что должно быть эффективными данными о карте struc-ture, но работа худшего случая, которой она достигает для различных операций, является линейным временем, которое является не лучше, чем исполнение списка - и основанная на множестве карта imple-процессы мышления (такие как незаказанные списки и таблицы поиска, обсужденные в Главе 9). В этой секции мы описываем простой способ исправить эту проблему, чтобы достигнуть логарифмического времени для всех фундаментальных операций по карте.

Определение дерева AVL

Простое исправление должно добавить правило к определению дерева двоичного поиска что главный -

оловянные амальгамы логарифмическая высота для дерева. Правило, которое мы рассматриваем в этой секции, является следующей собственностью баланса высоты, которая характеризует структуру дерева двоичного поиска T с точки зрения высот его внутренних узлов (отзыв от Раздела 7.2.1, что высота узла v в дереве является длиной самого длинного пути от v до внешнего узла): Собственность баланса высоты: Для каждого внутреннего узла v T, высот chil-

dren v отличаются самое большее 1. Любое дерево двоичного поиска T, который удовлетворяет собственность баланса высоты, как говорят, является деревом AVL, названным в честь инициалов его изобретателей, Адел'сон-Вел'ския и Лэндиса. Пример дерева AVL показывают в рисунке 10.8.

Рисунок 10.8: пример дерева AVL. Ключи записей показывают в узлах, и высоты узлов показывают рядом с узлами.

Непосредственное следствие собственности баланса высоты - то, что поддерево дерева AVL - самостоятельно дерево AVL. У собственности баланса высоты есть также важное последствие хранения маленькой высоты, как показано в следующем суждении.