Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2_SAOD_-_Dinamicheskie_struktury_dannykh.doc
Скачиваний:
120
Добавлен:
21.03.2016
Размер:
1.66 Mб
Скачать
  1. Дерево поиска

Бинарные деревья часто используются для представления множества данных, среди которых идет поиск элементов по уникальному ключу. Если дерево организовано так, что для каждого узла tвсе ключи его левого поддерева меньше ключаt, а все ключи правого поддереваtбольше ключаt, то такое дерево будем называтьдеревом поиска. В нем легко найти элемент с нужным ключом – достаточно, начав с корня, двигаться в левое или правое поддерево на основании сравнения заданного ключа с ключом текущего узла. Известно, что изnэлементов можно построить бинарное дерево с высотой не более log2n, поэтому, если дерево идеально сбалансировано, поиск среди егоnэлементов выполняется максимум за log2nсравнений. Подобные деревья широко используются и для сортировки больших массивов данных, так как обход дерева поискаслева направодает отсортированную в порядке возрастания последовательность ключей.

При обходе слева направо дерева поиска, приведенного ниже, получается последовательность: 1, 4, 8, 9, 11, 15, 20.

  1. Операции над деревом поиска

Над деревом поиска могут быть выполнены все операции, определенные для бинарного дерева. Но в основном к дереву поиска применяются операции, определяемые особенностями его организации:

  • поиск элемента с заданным ключом Keyв дереве и возвращение адреса элемента, если он найден, в противном случае возвращается значениеnil– операцияAddr(Key);

  • поиск по дереву с включением – поиск элемента с ключом Keyв дереве, подключение узла с этим ключом, если поиск был неудачным, и возвращение адреса элемента с заданным ключом – операцияSearch(Key);

  • поиск по дереву с исключением – поиск элемента с заданным ключом в дереве и исключение этого элемента, если он найден, – операция Delete(Key); после исключения дерево должно остаться деревом поиска.

Для построения дерево поиска, можно использовать операцию поиска по дереву с включением Search(Key), считывая из входного потока элементы с заданными ключами и включая их в дерево поиска. ОперацияSearch(Key)может быть построена таким образом, что она будет включать в дерево элемент и в том случае, если он уже существует в дереве. Использование такой операции для построения дерева поиска позволяет построить дерево с повторяющимися ключами.

  1. Реализация дерева поиска

В общем случае каждый элемент дерева поиска может содержать в содержательной части Valueспециальное поле, называемое ключом этого элемента. Для упрощения описания будем считать, что полеValueявляется ключом элемента дерева. В этом случае классtSearchTreeможет быть описан как наследник классаtBinaryTree:

type

tSearchTree = class(tBinaryTree) // класс - дерево поиска

function Addr(Key: tValue): pItem; // поиск элемента с ключом Key

function Search(Key: tValue): pItem; // поиск с включением

procedure Delete(Key: tValue); // поиск с исключением

procedure Build(var f: Text); // построение дерева поиска

end; // tSearchTree

Метод Buildдерева поиска перекрывает одноименный метод бинарного дерева, поскольку реализуется иначе. ПолеfRootи все остальные методы бинарного дерева наследуются деревом поиска. МетодыLocate,SearchиDeleteявляются новыми, расширяющими возможности дерева поиска по сравнению с обычным бинарным деревом.