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

Деревья поиска

Двоичные деревья часто используются для представления наборов данных, элементы которого ищутся по уникальному, только им присущему ключу.

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

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

Скорость поиска в деревьях поиска примерно такая же, что и в отсортированных массивах: O(Clog2n), в худшем случае O(n).

Построение дерева поиска

При построении дерева поиска и при последующем поиске узла по его ключу место каждого ключа можно найти, двигаясь, начиная от корня, и переходя на левое или правое поддерево каждого узла в зависимости от значения ключа.

Начиная с пустого дерева, очередное число ищется в дереве:

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

  • Если нет, число вставляется в дерево с начальным значением счетчика=1.

Поскольку определение двоичного дерева рекурсивно, то все операции над деревом могут быть реализованы в виде рекурсивных подпрограмм. Замечание: использование рекурсии замедляет работу программы и расходует лишнюю память при её выполнении.

program TreeSearch; {Дерево поиска}

type ref=^node;

node=record

key:integer;

count:integer;

left,right:ref

end;

var Root:ref; k:integer;

procedure Gen(x:integer; var t:ref); {Генерация нового узла}

begin

new(t);

t^.key:=x; t^.count:=1;

t^.left:=nil; t^.right:=nil

end;

procedure Search (x:integer; var t:ref);{Поиск х в дереве t}

begin

if t=nil

then Gen(x,t) {Добавление узла в дерево, т.к. числа x в дереве нет}

else if (x = t^.key)

then t^.count:=t^.count+1 {Число x есть в дереве}

else if (x < t^.key)

then Search(x, t^.left) {Поиск в левом поддереве}

else Search(x, t^.right) {Поиск в правом поддереве}

end;

procedure PrintTree(t:ref; h:integer); {Вывод дерева. Обход дерева справа налево}

var i:integer;

begin

if t<>nil then

begin

PrintTree(t^.right,h+1);

for i:=1 to h do write(' ');

writeln(t^.key, ’_', t^.count);

PrintTree(t^.left, h+1);

end

end;

procedure Infix(t: ref); {Обход дерева слева направо. Дает вывод в отсортированном порядке}

begin

if (t<>nil)

then begin

Infix(t^.Left); {Переход в левое поддерево}

write(t^.key:3);

Infix(t^.Right) {Переход в правое поддерево}

end

end;

begin

Root:=nil; {Создание пустого дерева}

write('='); readln(k);

while (k<>0) do {При k=0 построение дерева завершается}

begin

Search(k, Root);

write('='); readln(k);

end;

PrintTree(Root,0);{Вывод дерева}

Infix(Root); {Вывод листьев дерева в отсортированном порядке}

end.

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