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

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

Удаление

Давайте теперь рассмотрим удаление входа с ключом k от (2, 4) дерево T. Мы начинаем такую операцию, выполняя поиск в T для входа с ключом k. Пере - перемещение такого входа от (2, 4) дерево может всегда уменьшаться до случая, где вход, который будет удален, сохранен в узле v, чьи дети - внешние узлы. Предположим, например, что вход с ключом k, что мы хотим удалить, сохранен в ith входе (ki, xi) в узле z, у которого есть только дети внутреннего узла. В этом случае мы обмениваем вход (ki, xi) с соответствующим входом, который сохранен в узле v с детьми внешнего узла следующим образом (см. рисунок 10.25 (d)):

1. Мы считаем самый правый внутренний узел v в поддереве внедренным в ith ребенке

z, отмечая, что дети узла v являются всеми внешними узлами.

2. Мы обмениваем вход (ki, xi) в z с последним входом v.

Как только мы гарантируем, что вход, чтобы удалить сохранен в узле v с только внешним - дети узла (потому что или это уже было в v, или мы обменяли его в v), мы просто удаляем вход из v (то есть, из карты M (v)) и удаляем ith внешний узел v.

Удаление входа (и ребенок) от узла v, как описано выше заповедников собственность глубины, потому что мы всегда удаляем внешнего ребенка узла из узла v с только детьми внешнего узла. Однако в удалении такого внешнего узла мы можем нарушить собственность размера в v. Действительно, если v был ранее с 2 узлами, то это становится 1 узлом без записей после удаления (рисунок 10.25 (d) и (e)), которому не позволяют войти (2, 4) дерево. Этот тип нарушения собственности размера называют underflow в узле v. Чтобы исправить underflow, мы проверяем, является ли непосредственный родной брат v с 3 узлами или с 4 узлами. Если мы находим такого родного брата w, то мы выполняем операцию по передаче, в которую мы перемещаем ребенка w к v, ключу w к родительскому u v и w, и ключу u к v. (См. рисунок 10.25 (b) и (c).) Если у v есть только один родной брат, или если оба непосредственных родных брата v - 2 узла, то мы выполняем операцию по сплаву, в которую мы сливаем v с родным братом, создавая новый узел v ′, и перемещаем ключ от родительского u v к v ′. (См. рисунок 10.26 (e) и (f).)

Операция по сплаву в узле v может заставить новый underflow происходить в родительском u v, который в свою очередь вызывает передачу или сплав в u. (См. рисунок 10.26.) Следовательно, число операций по сплаву ограничено высотой дерева, которое является O (зарегистрируйте n) Суждением 10.8. Если underflow размножается полностью до корня, то корень просто удален. (См. рисунок 10.26 (c) и (d).) Мы показываем последовательность удалений из (2, 4) дерево 10.25 в цифрах и 10.26.

10.4. (2,4) Деревья 471

(a) (b)

(c) (d)

(e) (f)

(g) (h)

Рисунок 10.25: последовательность удалений из (2, 4) дерево: (a) удаление 4, вызывая underflow; (b) операция по передаче; (c) после операции по передаче; (d) удаление 12, вызывая underflow; (e) операция по сплаву; (f) после операции по сплаву; (g) удаление 13; (h) после удаления 13.