Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
structure_and_algorithms_data_producing_part_1.doc
Скачиваний:
4
Добавлен:
21.04.2019
Размер:
229.38 Кб
Скачать

Бинарное дерево поиска. Построение и поиск элемента

На рис.1 приведена структура БДП, а на рис.2 – структура отдельного узла дерева. На рис.2 поле Inf – информационное поле, поле Left – указатель на «потомка» слева, Right – указатель на «потомка» справа. Стоит отметить, что в БДП не может быть одинаковых ключей.

Рис.1 Рис.2

left

inf

right

Структура БДП:

type

point = ^element; {указатель в списке }

element = record {элемент списка }

inf: integer; {информационная часть }

left, right: point {указатели на «потомков»}

end;

Построение дерева:

Осуществляется путем ввода элементов с информационными ключами, на основании которых строится дерево. Для включения вершины в дерево прежде всего нужно найти в дереве ту вершину, к которой можно присоединить новую вершину. При этом упорядоченность ключей должна сохраняться. Нужная вершина в дереве ищется по ключу который нужно вставить. Пусть построено некоторое дерево и требуется найти звено с ключом X. Сначала сравниваем с X ключ, находящийся в корне дерева. В случае равенства вставка невозможна. В противном случае переходим к рассмотрению вершины, которая находится слева внизу, если ключ X меньше только что рассмотренного, или справа внизу, если ключ X больше только что рассмотренного. Сравниваем ключ X с ключом, содержащимся в этой вершине, и т.д. Процесс завершается в одном из двух случаев:

  • найдена вершина, содержащая ключ, равный ключу X;

  • в дереве отсутствует вершина, к которой нужно перейти для выполнения очередного шага поиска (указатель = NIL).

В первом случае вставка невозможна. Во втором случае будет найдена вершина, к которой нужно присоединить данный ключ. Для вставки используется рекурсивная функция.

На PASCAL это выглядит следующим образом:

procedure Insert(var p: point; inf: integer; var f: boolean);

begin

f:=false;

if p=nil then

begin

new(p);

p^.key:=inf;

p^.left:=nil;

p^.right:=nil;

end

else

if inf<p^.key then Insert(p^.left,inf,f)

else

if inf>p^.key then Insert(p^.right,inf,f)

else

if inf=p^.key then f:=true ;

end;

Поиск элемента:

Нужная вершина в дереве ищется по ключу. Поиск в бинарном дереве осуществляется следующим образом:

Пусть построено некоторое дерево и требуется найти звено с ключом X. Сначала сравниваем с X ключ, находящийся в корне дерева. В случае равенства поиск закончен и нужно возвратить указатель на корень в качестве результата поиска. В противном случае переходим к рассмотрению вершины, которая находится слева внизу, если ключ X меньше только что рассмотренного, или справа внизу, если ключ X больше только что рассмотренного. Сравниваем ключ X с ключом, содержащимся в этой вершине, и т.д. Процесс завершается в одном из двух случаев:

  • найдена вершина, содержащая ключ, равный ключу X. Тогда возвращается указатель на найденную вершину.

  • в дереве отсутствует вершина, к которой нужно перейти для выполнения очередного шага поиска.

На PASCAL это выглядит следующим образом:

function Search(inf: integer; p: point): point;

begin

while (p<>nil) and (p^.key<>inf) do

if p^.key<inf then p:=p^.right

else p:=p^.left;

Search:=p;

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]