ПРАКТИЧЕСКОЕ ЗАНЯТИЕ № 5

Тема: «Сортировка с помощью дерева»

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

 

Ход работы

Теоретические обоснования

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

Лабораторная работа № 9. СОРТИРОВКА С ПОМОЩЬЮ ДЕРЕВА - портал intellect.ml

 

Существует множество способов упорядочивания дерева. Рассмотрим один из них :

"Левый" сын имеет ключ меньше, чем ключ " Отца "

"Правый" сын имеет ключ больше, чем ключ " Отца "

 

Получили бинарное упорядоченное дерево с минимальным числом уровней.

Строго сбалансированное дерево: дерево, в котором левое и правое поддерево имеют уровни, отличающиеся не более, чем на единицу.

Рассмотрим принцип построения дерева при занесении элементов в массив: пусть в первоначально пустой массив заносятся последовательно поступающие элементы : 70, 60, 85, 87, 90, 45, 30, 88, 35, 20, 86 ; Так как  это еще пустое дерево, то ссылки left и right равны nil (left - указатель на левого сына (элемент), right - указатель на правого сына (элемент)). Четвертый из поступающих элементов 87. Так как этот ключ больше ключа 70 (корень), то новая вершина должна размещаться на правой ветви дерева. Чтобы определить ее место, спускаемся по правой стрелке к очередной вершине (с ключом 85), и если поступивший ключ больше 85, то новую вершину делаем правым сыном вершины с ключом 85.

Лабораторная работа № 9. СОРТИРОВКА С ПОМОЩЬЮ ДЕРЕВА - портал intellect.ml

 

В рассмотренном примере ПРИНЦИП ПОСТРОЕНИЯ ДЕРЕВА имеет следующий вид: если поступает очередной элемент массива, то начиная с корня дерева (в зависимости от сравнения текущего элемента с очередной вершиной) идем влево или вправо от нее до тех пор, пока не найдем подходящую вершину, к которой можно подключить новую вершину с текущим ключом. В зависимости от результата сравнения ключей, новую вершину делаем левой или правой для найденной вершины.

 

Алгоритм

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

Лабораторная работа № 9. СОРТИРОВКА С ПОМОЩЬЮ ДЕРЕВА - портал intellect.ml

Описание типа

type pelem = ^elem;

elem = record

left : pointer;

right : pointer;

K : integer;

end;

 

K - элемент массива, V - указатель на созданный элемент.

В процедуре создания дерева бинарного поиска будут использованы следующие указатели:

tree - указатель на корень дерева;

p - рабочий указатель;

q - указатель отстающий на шаг от p;

key - новый элемент массива;

 

Создание дерева бинарного поиска:

writeln(' Введите элемент массива ');

readln(key);

tree:=maketree(key);

p:=tree;

while not eof do

begin

            readln(key);

            v:=maketree(key);

            while p<>nil do

            begin

                        q:=p;

                        if key  else p:=right(p);

            end;

            if p=nil then 

            begin

                        writeln('Это корень');

                        tree:=v;

            end

            else  if key  else right(p):=v;

end;

 

При обходе дерева слева - направо получаем отсортированный массив 20, 30, 35, 45, 60, 70, 82, 85, 86, 87, 88, 90. Элемент дерева заносится в массив при втором заходе в него (на рисунке вторые заходы показаны зелеными стрелками).

Лабораторная работа № 9. СОРТИРОВКА С ПОМОЩЬЮ ДЕРЕВА - портал intellect.ml

 

Обход дерева слева - направо

procedure InTree(tree);

begin

if Tree = nil then write('Дерево пусто')

else 

with Tree^ do

begin

if left<>nil then InTree(left);

if right<>nil then InTree(right); 

end;

end;

 

Решить самостоятельно:

           

            На заводе выпустили детали со следующими серийными номерами : 45, 56, 13, 75, 14, 18, 43, 11, 52, 12, 10, 36, 47, 9. Детали с четными номерами поступают на склад №1, а с нечетными на слад №2. Требуется отсортировать детали на складе №1.