Поиск в бинарных деревьях
В разделе 1 мы использовали двоичный поиск
для поиска данных в массиве. Этот метод чрезвычайно эффективен, поскольку
каждая итерация вдвое уменьшает число элементов, среди которых нам нужно
продолжать поиск. Однако, поскольку данные хранятся в массиве, операции
вставки и удаления элементов не столь эффективны. Двоичные деревья позволяют
сохранить эффективность всех трех операций - если работа идет с "случайными"
данными. В этом случае время поиска оценивается как
O(lg n). Наихудший случай - когда вставляются
упорядоченные данные. В этом случае оценка время поиска -
O(n). Подробности вы найдете в работе
Кормена [1990].
Теория
Двоичное дерево - это дерево, у которого каждый узел имеет не более двух
наследников. Пример бинарного дерева приведен на рис. 3.2. Предполагая,
что k содержит значение, хранимое в данном узле, мы можем сказать,
что бинарное дерево обладает следующим свойством: у всех узлов, расположенных
слева от данного узла, значение соответствующего поля меньше, чем k,
у всех узлов, расположенных справа от него, - больше. Вершину дерева называют
его корнем, узлы, у которых отсутствуют оба наследника, называются
листьями. Корень дерева на рис. 3.2 содержит 20, а листья -
4, 16, 37 и 43. Высота дерева - это длина наидлиннейшего из путей от
корня к листьям. В нашем примере высота дерева равна 2.
реализации алгоритма на Си
операторы
typedef T и
compGT следует изменить так, чтобы они
соответствовали данным, хранимым в дереве. Каждый узел
Node содержит
указатели
left,
right на левого и правого потомков, а также
указатель
parent на предка. Собственно данные хранятся в поле
data. Адрес узла, являющегося корнем дерева хранится в укзателе
root, значение которого в самом начале, естественно,
NULL.
Функция
insertNode запрашивает память под новый узел и вставляет
узел в дерево, т.е. устанавливает нужные значения нужных указателей.
Функция
deleteNode, напротив, удаляет узел из дерева (т.е.
устанавливает нужные значения нужных указателей), а затем освобождает
память, которую занимал узел. Функция
findNode ищет в дереве узел,
содержащий заданное значение.
Оглавление