
- •Основы программирования на языке паскаль
- •1. Простейшие программы Структура Паскаль-программы
- •Данные и тип данных
- •Стандартные функции
- •Выражения
- •Организация простейших программ
- •Модуль crt
- •Задания для самостоятельной работы
- •2. Ветвления
- •Задания для самостоятельной работы
- •3. Циклы
- •Оператор цикла с постусловием используется, когда известно условие, при котором цикл будет прекращать свою. Формат оператора:
- •Задания для самостоятельной работы
- •4. Массивы
- •Сортировка
- •Задания для самостоятельной работы
- •5. Строки
- •Задания для самостоятельной работы
- •6. Процедуры и функции
- •Параметры
- •Локальные и глобальные переменные
- •Функции
- •Задания для самостоятельной работы
- •7. Записи
- •Задания для самостоятельной работы
- •8. Множества
- •Операции над множествами
- •Задания для самостоятельной работы
- •9. Файлы
- •Стандартные процедуры и функции для работы с файлами всех типов
- •Стандартные процедуры и функции для работы с типизированными файлами
- •Задания для самостоятельной работы
- •10. Модуль graph
- •Процедуры и функции модуля graph
- •Задания для самостоятельной работы
- •11. Модули, определяемые пользователем
- •Задания для самостоятельной работы
- •12. Линейные однонаправленные списки Указатели
- •Линейные однонаправленные списки
- •Задания для самостоятельной работы
- •13. Двунаправленные списки.
- •Задания для самостоятельной работы
- •14. Кольцевые списки
- •Задания для самостоятельной работы
- •15. Стеки и очереди
- •Задания для самостоятельной работы
- •16. Деревья
- •Задания для самостоятельной работы
- •Простейшие программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
- •Бадмаева Энгельсина Сергеевна, Тонхоноева Антонида Антоновна
- •670000, Г. Улан-Удэ, ул. Смолина, 24-а.
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.