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

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

10.1.1 Поиск

Чтобы выполнить операцию находят (k) в карте M, которая представлена с двоичным поиском

дерево T, мы рассматриваем дерево T как дерево решений (вспомните рисунок 7.10). В этом случае вопрос, который задают в каждом внутреннем узле v T, состоит в том, является ли ключ поиска k меньше, чем, равный, или больше, чем ключ, сохраненный в узле v, обозначенный с ключом (v). Если ответ «меньше», то поиск продолжается в левом поддереве. Если ответ «равен», то поиск заканчивается успешно. Если ответ «больше», то поиск продолжается в правильном поддереве. Наконец, если мы достигаем внешнего узла, тогда поиск заканчивается неудачно. (См. рисунок 10.2.)

Рисунок 10.2: (a) дерево двоичного поиска T представление карты с ключами целого числа; (b) узлы T, который посещают, когда выполняющие операции находят (76) (успешный) и находят (25) (неудачный) на M. Для простоты мы показываем только ключи записей.

Мы описываем этот подход подробно в Кодовом Фрагменте 10.1. Учитывая ключ поиска k и узел v T, эта функция, TreeSearch, возвращает узел (положение) w поддерева T (v) из T, внедренных в v, таком, что одно из следующего происходит:

w - внутренний узел, и у входа w есть ключ, равный k

w - внешний узел, представляющий надлежащее место k в inorder пересечении

T (v), но k не ключ, содержавшийся в T (v)

Таким образом, функция находят (k), может быть выполнен, назвав TreeSearch (k, T.root ()). Позвольте w быть узлом T, возвращенного этим требованием. Если w - внутренний узел, то мы возвращаем вход w; иначе, мы возвращаем пустой указатель. Алгоритм TreeSearch (k, v):

если T.isExternal(v) тогда

возвратите v

если k <ключ (v) тогда

возвратите TreeSearch (k, T.left(v))

еще, если k> ключ (v) тогда

возвратите TreeSearch (k, T.right(v))

возвратите v Мы знаем k = ключ (v)

Кодовый Фрагмент 10.1: Рекурсивный поиск в дереве двоичного поиска.

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

Анализ поиска двоичного дерева

Анализ продолжительности худшего случая поиска в дереве двоичного поиска T прост. Алгоритм TreeSearch рекурсивный и выполняет постоянное число примитивных операций для каждого рекурсивного вызова. Каждый рекурсивный звонок TreeSearch сделан на ребенка предыдущего узла. Таким образом, TreeSearch называют на узлах пути T, который начинается в корне и спускается по одному уровню за один раз. Таким образом число таких узлов ограничено h + 1, где h - высота T. Другими словами, так как мы тратим O (1) время за узел, с которым сталкиваются в поиске, функция находит на пробегах карты M в O (h) время, где h - высота дерева двоичного поиска T, раньше осуществлял M. (См. рисунок 10.3.)

Рисунок 10.3: продолжительность поиска в дереве двоичного поиска. Мы используем stan - dard короткий путь визуализации просмотра дерева двоичного поиска как большой треугольник и путь от корня как зигзагообразная линия.

Мы можем также показать, что изменение вышеупомянутого алгоритма выполняет операцию findAll (k) словаря ADT вовремя O (h + s), где s - число возвращенных записей. Однако эта функция немного более сложна, и детали оставляют как осуществление (Упражнение C-10.2).

По общему признанию высота h T может быть столь же большой как число записей, n, но мы ожидаем, что это обычно намного меньше. Действительно, мы показываем, как поддержать верхнюю границу O (зарегистрируйте n) на высоте дерева поиска T в Разделе 10.2. Прежде чем мы опишем такую схему, однако, давайте опишем внедрения для функций обновления карты.