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

10.2. Деревья avl 443

(a)

(b)

(c)

(d)

Рисунок 10.10: Схематическая иллюстрация trinode реструктуризация операции (Кодовый Фрагмент 10.12): (a) и (b) единственное вращение; (c) и (d) двойное вращение.

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

Удаление

Как имел место для операции по карте вставки, мы начинаем внедрение

сотрите операцию по карте на дереве AVL T при помощи алгоритма для выполнения этой операции на регулярном дереве двоичного поиска. Добавленная трудность в использовании этого AP - proach с деревом AVL состоит в том, что это может нарушить собственность баланса высоты. В частности после удаления внутреннего узла с операцией removeAboveExternal и подъемом одного из его детей в его место, может быть неуравновешенный узел в T на пути от родительского w ранее удаленного узла к корню T. (См. рисунок 10.11 (a).) Фактически, самое большее может быть один такой неуравновешенный узел. (Оправдание этого факта оставляют как Упражнение C-10.13.)

Рисунок 10.11: Удаление входа с ключевыми 32 от дерева AVL рисунка 10.8: (a) после удаления ключа хранения узла 32, корень становится неуравновешенным; (b) (единственное) вращение восстанавливает собственность баланса высоты.

Как со вставкой, мы используем trinode, реструктурирующий, чтобы восстановить баланс в дереве T. В частности позвольте z быть повышением первого неуравновешенного узла, с которым сталкиваются, от w к корню T. Кроме того, позвольте y быть ребенком z с большей высотой (обратите внимание на то, что узел y является ребенком z, который не является предком w), и позвольте x быть ребенком y, определенного следующим образом: если один из детей y более высок, чем другой, позвольте x быть более высоким ребенком y; еще (у обоих детей y есть та же самая высота), позвольте x быть ребенком y на той же самой стороне как y (то есть, если y - покинутый ребенок, позвольте x быть покинутым ребенком y, еще позвольте x быть правильным ребенком y). В любом случае мы тогда выполняем реструктурирование (x) операция, которая восстанавливает собственность баланса высоты в местном масштабе в поддереве, которое было раньше внедрено в z и теперь внедрено в узле, который мы временно назвали b. (См. рисунок 10.11 (b).)

К сожалению, эта реструктуризация trinode может уменьшить высоту поддерева, внедренного в b на 1, который может заставить предка b становиться выведенным из равновесия. Так, после перебалансирования z, мы продолжаем идти по поиску T неуравновешенных узлов. Если мы находим другого, мы выполняем реструктурировать операцию, чтобы восстановить ее баланс и продолжить идти T ищущий больше, полностью к корню. Однако, так как высота T - O (зарегистрируйте n), где n - число записей Суждением 10.2, O (зарегистрируйтесь, n) trinode restructurings достаточны, чтобы восстановить собственность баланса высоты.