Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Нестеров.docx
Скачиваний:
3
Добавлен:
22.09.2019
Размер:
267.49 Кб
Скачать

Вопрос 26.

Деревья, основные определения. Понятие бинарного дерева. Способы представления деревьев.

Дерево - граф без цикла

- динамическая структура

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

Узел дерева – элемент, который имеет выше или ниже стоящие элементы.

Лист дерева – элемент, который не имеет поддеревьев.

Корень дерева – самый верхний элемент

Самые простые из деревьев считаются бинарные деревья.

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

Бинарные деревья достаточно просто могут быть представлены в виде списков или массивов. Списочное представление бинарных деревьев основано на элементах, соответствующих узлам дерева. Каждый элемент имеет поле данных и два поля указателей. Один указатель используется для связывания элемента с правым потомком, а другой √ с левым. Листья имеют пустые указатели потомков. При таком способе представления дерева обязательно следует сохранять указатель на узел, являющийся корнем дерева.

Структура данных для дерева:

type

pEl=^El;

El=record

d:integer;

left, right:pEl;

end;

var

pTop :pEl;

procedure CreateTree;

begin

pTop:=nil;

end;

procedure Add(var a:pEl; x:integer);

begin

If a<>nil then

begin

If a.d>=x then

begin

If a.left=nil then

begin

New(a.left);

a.left.left:=nil;

a.left.right:=nil;

a.left.d:=x;

end

else

Add(a.left,x);

end

else

begin

If a.right=nil then

begin

New(a.right);

a.right.left:=nil;

a.right.right:=nil;

a.right.d:=x;

end

else

Add(a.right,x);

end

end

else

begin

New(a);

a.left:=nil;

a.right:=nil;

a.d:=x;

end;

end;

procedure ShowTree(a:pEl;k:integer);

var S:String;

i:integer;

begin

k:=k+7;

If a.right<>nil then ShowTree(a.right,k);

S:='';

for i:=1 to k-7 do S:=S+' ';

S:=S+IntToStr(a.d);

Form1.Memo1.Lines.Add(S);

If a.left<>nil then ShowTree(a.left,k);

k:=k-7;

end;

Вопрос 27.

Бинарное дерево. Способы прохождения дерева.

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

Эти подмножества называются левым и правым поддеревьями исходного дерева.

Каждый элемент бинарного дерева называется узлом дерева.

Обход бинарного дерева означает систематическое перечисление всех узлов для выполнения необходимой функциональной обработки. Наиболее известны и практически важны 3 способа прохождения, которые отличаются порядком и направлением обхода бинарного дерева. Можно проходить узлы в прямом порядке (сверху-вниз), в симметричном порядке (слева-направо) и, наконец, в концевом порядке (снизу-вверх). Рекурсивные алгоритмы прохождения каждого дерева по каждому из способов включают 3 одинаковых процедуры, где нужно найти корень поддерева, левое поддерево текущего корня и правое поддерево текущего корня. Направление обхода однозначно определяет последовательность выполнения указанных процедур. Последовательность их рекурсивного вызова для каждого способа прохождения перечислена в следующей таблице.

Порядок прохождения

Прямой

(префиксный)

Симметричный (инфиксный)

Концевой

(постфиксный)

  1. Корень поддерева

  2. Левое поддерево

  3. Правое поддерево

  1. Левое поддерево

  2. Корень дерева

  3. Правое поддерево

  1. Левое поддерево

  2. Правое поддерево

  3. Корень дерева

procedure ShowTree(a:pEl);

begin

If a.left<>nil then ShowTree(a.left);

Form1.Memo1.Lines.Add(a.d);

If a.right<>nil then ShowTree(a.right);

end;