
- •Глава 6. Алгоритмы поиска
- •6.1. Последовательный поиск
- •6.2. Бинарный поиск в упорядоченной таблице
- •6.3. Поиск Фибоначчи в упорядоченной таблице
- •6.4. Поиск по бинарному дереву
- •6.4.1. Бинарное дерево поиска
- •6.4.2. Поиск и вставка в дереве поиска.
- •6.4.3.Удаление из дерева поиска
- •6.4.4. Оптимальное бинарное дерево поиска
- •6.5. Префиксный цифровой поиск
- •6.5.1. Префиксное дерево
- •6.5.2. Алгоритм префиксного поиска
- •6.6. Поиск по вторичным ключам
6.4. Поиск по бинарному дереву
6.4.1. Бинарное дерево поиска
Если массив ключей динамически изменяется за счёт удалений и вставок, то нецелесообразно тратить время на постоянное
завершение этих операций новыми сортировками. Представление совокупности ключей бинарным деревом не только упрощает удаления и вставки элементов (путём изменения цепных ссылок), но и позволяет эффективно проводить поиск и сортировку.
Напомним, что узлы
бинарного дерева — записи, которые
помимо поля значения
,
указателя
на левое поддерево и указателя
на правое поддерево содержат также
ключевое поле
;
если какое-нибудь из поддеревьев
отсутствует, соответствующий указатель
имеет значение
(оба поддерева заведомо отсутствуют у
листьев дерева, то есть у концевых
узлов). Указатель на искомую запись
бинарного дерева обозначим через
;
указатель на корень дерева обозначим
через
(см. п. 2.5).
Бинарное дерево
является деревом
поиска, если
для каждого узла
его левый потомок имеет меньшее значение
ключа, а правый — не меньшее:
,
причём такое же
неравенство распространяется от
непосредственных потомков узла
на все узлы
и
его левого и правого поддерева
соответственно:
.
На рис. 41 приведено бинарное дерево поиска.
Рис. 41.
Бинарное дерево поиска обладает следующими важными свойствами:
- максимальное значение ключа находится в крайнем правом узле; переход к этому узлу из корня производится по ссылкам на правого потомка до тех пор, пока такие ссылки не пусты;
- минимальное значение ключа находится в крайнем левом узле; переход к этому узлу из корня производится по ссылкам на левого потомка до тех пор, пока такие ссылки не пусты;
- для перехода к
узлу с непосредственно следующим за
значением ключа нужно сначала перейти
к правому потомку
,
а далее смещаться по ссылкам на левого
потомка до тех пор, пока эти ссылки не
пусты;
- для перехода к
узлу с непосредственно предшествующим
значением ключа нужно сначала перейти
к левому потомку
,
а далее смещаться по ссылкам на правого
потомка до тех пор, пока эти ссылки не
пусты.
6.4.2. Поиск и вставка в дереве поиска.
Рассмотрим поиск
по дереву поиска указателя
на узел с заданным значением ключа
со вставкой новой записи, если ключ не
найден.
Алгоритм поиска и вставки в дереве поиска может быть реализован рекурсивно: сравнить ключ поиска со значением ключа в корневом узле; если ключи совпадают, выдать указатель на найденный ключ; в противном случае искать ключ рекурсивно в левом или правом поддереве — в зависимости от выявленного неравенства.
Циклическая реализация алгоритма содержит следующие этапы:
╔
Ш1.
Начальные установки:
.
Ш2. Сравнение:
если
,
то
переход к шагу Ш3;
если
,
то
переход к шагу Ш4;
если
,
то
поиск завершается.
Ш3. Переход к левому поддереву:
если
,
то
;
переход к Ш2;
иначе
переход к Ш5.
Ш4. Переход к правому поддереву:
если
,
то
;
переход к Ш2;
иначе
переход к Ш5.
Ш5. Вставка ключа в дерево при неудачном поиске:
из списка свободной памяти выбирается адрес
и заменяется там
на следующий;
указателю
вставляемой записи с ключом
присваивается выбранный адрес и вставляемая
запись делается концевым узлом:
;
;
;
3) устанавливается связь с узлом, до этого бывшим
концевым:
если
было
,
то
,
иначе
.
╚
Недостатком
данного алгоритма является теоретическая
возможность превращения дерева фактически
в линейный список, когда все поля связи
либо все поля связи
оказываются пустыми.
Среднее число
сравнений при поиске в дереве с
узлами имеет порядок
(логарифм натуральный). Алгоритм может
быть использован для сортировки ключей,
и особенно эффективен при совмещении
поиска и сортировки.
NB: Алгоритм вставки элемента в бинарное дерево поиска, начиная с корня для исходно пустого дерева, обеспечивает сохранение следующего условия: Все ключи, которые больше расположенного в данном узле, попадают в ходе вставок в его правое поддерево, а ключи, которые меньше — в левое.
Префиксная стратегия обхода дерева (см. п. 2.5) позволяет выводить ключи в порядке возрастания. Это даёт ещё один механизм сортировки — сортировку обходом дерева поиска.