- •Структуры и алгоритмы обработки данных
- •Часть 1
- •Последовательное представление линейных списков
- •Связанное представление линейных списков
- •Очередь
- •Связанное представление матриц
- •Бинарное дерево поиска. Построение и поиск элемента
- •Бинарное дерево поиска. Удаление элемента
- •Линейные списки с индексами. Построение и поиск элемента. Способы коррекции
- •Инвертированные списки
- •Построение словаря с использованием деревьев
- •Построение словаря с использованием матриц
Бинарное дерево поиска. Построение и поиск элемента
На рис.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;