Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MET1.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.14 Mб
Скачать

16. Деревья

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

Бинарное (двоичное) дерево является важнейшим классом деревьев. По аналогии с определением дерева, бинарное дерево либо пусто, либо состоит из корня и двух непересекающихся бинарных деревьев, называемых левым и правым поддеревьями (ЛПД и ППД) данного корня. Дерево считается сбалансированным, если для каждой его вершины число вершин в ее ЛПД и ППД отличается не более чем на единицу.

В Турбо Паскале узлы бинарного дерева описывают как записи с двумя полями-указателями и одним или несколькими информационными полями. Базовый тип для указателя тот же тип данных, что и тип элементов дерева. Вместе с каждым деревом рассматривается переменная, значением которой является ссылка на корень дерева. Если дерево пусто, то ее значение – Nil. Именно эта переменная и представляет дерево как единый объект.

Например, определить бинарное дерево, узлы которого содержат целые числа, можно следующим образом:

Type Tree=^Uzel;

Uzel=Record

inf : Integer;

left, right: Tree

End;

Var Koren: Tree;

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

Пример 27. Упорядочить последовательность натуральных чисел по возрастанию, используя ДДП. Признак конца последовательности – 0.

Program Example_27;

Type Tree=^Uzel;

Uzel=Record

inf : Integer;

left, right: Tree

End;

Var Koren: Tree; Number: Integer;

{***процедура вставки элемента в дерево***}

Procedure Ins (Koren: Tree; i: Integer);

{Ocher ищет в дереве пустую ссылку, Pred хранит адрес узла, в котором эта ссылка будет найдена}

Var Ocher, Pred: Tree;

Begin

Ocher:= Koren;

While Ocher <> Nil do

Begin

Pred:= Ocher;

If i < Ocher^.inf Then Ocher:= Ocher^.left Else Ocher:= Ocher^.right

End;

{создание нового узла дерева}

New (Ocher);

With Ocher^ do

Begin inf:=i; left:=Nil; right:= Nil End;

{привязка нового узла к дереву}

If i < Pred^.inf Then Pred^.left:= Ocher Else Pred^.right:= Ocher

End;

{***процедура рекурсивного обхода дерева для печати его элементов***}

Procedure Obhod (Koren: Tree);

Begin

If Koren <> Nil Then

Begin

Obhod (Koren^.left); Write (Koren^.inf, ‘ ‘); Obhod (Koren^.right)

End

End;

{начало программы}

Begin

Koren:= Nil; Read (Number);

{создание корневого узла}

If Number <> 0 Then

Begin

New(Koren);

With Koren^ do

Begin

Inf:=Number; left:=Nil; right:=Nil

End

End;

{формирование ДДП до конца входного набора}

Read (Number);

While Number <> 0 do

Begin

Ins (Koren, Number); Read (Number)

End;

{распечатка элементов дерева по возрастанию}

Obhod (Koren);

Writeln

End.

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