на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно... |
Поисковые деревья
Операции с двоичным поисковым деревом
Процедура обходит все узлы поддерева с корнем в узле и печатает их ключи в неубывающем порядке:
Свойство упорядоченности гарантирует правильность алгоритма. Время работы на дереве с вершинами есть , каждая вершина обрабатывается один раз. Оператор напечатает ключи всех элементов в неубывающем порядке.
Заметим, что порядок, при котором корень предшествует узлам обоих поддеревьев, называется preorder ; порядок, в котором корень следует за ними, называется postorder.
Покажем, что двоичные поисковые деревья позволяют выполнять операции , , , и за время ( , где — высота дерева.
Поиск. Процедура поиска получает на вход искомый ключ и указатель на корень дерева и возвращает указатель на вершину с ключом (если такая есть) или (если такой вершины нет).
В процессе поиска мы двигаемся от корня, сравнивая ключ с ключом, хранящимся в текущей вершине . Если они равны, поиск завершается. Если , то поиск продолжается в левом поддереве , если же , то в правом. Длина пути поиска не превосходит высоты дерева, поэтому время поиска есть (где — высота дерева).
Итеративная версия процедуры Поиск
Минимум и Максимум. Элемент с минимальным ключом в дереве поиска можно найти, пройдя от корня по указателям , пока не упремся в . Процедура возвращает указатель на найденный элемент поддерева с корнем .
Оба алгоритма требуют времени , где — высота дерева.
Следующий и предыдущий элементы. Если — указатель на некоторый узел дерева, то процедура возвращает указатель на узел со следующим за элементом или , если указанный элемент — последний в дереве:
Приведенная процедура отдельно рассматривает два случая. Если правое поддерево вершины не пусто, то следующий за элемент — минимальный элемент в этом поддереве и он равен . Если правое поддерево вершины пусто, то идем от вверх, пока не найдем вершину, являющуюся левым сыном своего родителя. Этот родитель (если он есть) и будет искомым элементом. Время работы процедуры на дереве высоты есть , так как мы двигаемся либо только вверх, либо только вниз. Процедура симметрична.
Добавление элемента.
Процедура добавляет заданный элемент в подходящее место дерева . Параметром процедуры является указатель на новую вершину, в которую помещены значения , и . В ходе работы процедура изменяет дерево и (возможно) некоторые поля вершины , после чего новая вершина с данным значением ключа оказывается вставленной в подходящее место дерева:
Подобно процедурам и , процедура двигается вниз по дереву, начав с его корня. При этом в вершине сохраняется указатель на родителя вершины . Сравнивая с , процедура решает куда идти — налево или направо. Процесс завершается, когда становится равным . Этот стоит как раз там, куда надо поместить , что и делается. Очевидно, добавление требует времени для дерева высоты .
Удаление элемента
Параметром процедуры удаления является указатель на удаляемую вершину. При удалении возможны три случая. Если у нет детей, для удаления достаточно поместить в соответствующее поле его родителя вместо . Если у есть один ребенок, можно вырезать , соединив его родителя напрямую с его ребенком. Если же детей двое, находим следующий за элемент ; у него нет левого ребенка. Теперь можно скопировать ключ и дополнительные данные из вершины в вершину , а саму вершину удалить описанным выше способом.
Упражнения
- Напишите рекурсивный вариант процедуры .
- Напишите процедуру , удаляющую элемент из дерева .
- Набор из чисел можно отсортировать, сначала добавив их один за другим в двоичное дерево поиска с помощью процедуры , а потом обойти дерево с помощью процедуры . Оцените время работы такого алгоритма.
- Покажите, что если вершина двоичного дерева поиска имеет двоих детей, то следующая за ней вершина не имеет левого ребенка, а предшествующая — правого.