- •Содержание
- •Введение
- •Структуры данных Классификация структур данных
- •Операции над данными
- •Понятие алгоритма
- •Массивы Описание массива
- •Представление массивов в памяти
- •Рис 1. Представление вектора в памяти
- •Рис 2. Представление вектора ml в памяти
- •Алгоритмы поиска
- •Алгоритмы сортировки
- •Пример сортировки простыми вставками.
- •Описание записи
- •Операции над записями
- •Записи с вариантами
- •Представление записи в памяти
- •Общие процедуры и функции для работы с файлами
- •Процедуры и функции для работы с типизированными файлами.
- •Сортировка содержимого файлов (Внешняя сортировка)
- •Пример внешней сортировки прямым слиянием
- •Пример внешней сортировки естественным слиянием
- •Динамическая память и данные с динамической структурой
- •Ссылочный тип в языке Pascal
- •Типизированные указатели
- •Нетипизированные указатели
- •Операции над переменными ссылочного типа.
- •Динамические списки
- •Реализация списков на языке Pascal.
- •Стек, очередь, дек
- •Рекурсия
- •Нелинейные структуры данных. Деревья
- •Бинарные деревья
- •Реализация бинарных деревьев
- •Способы обхода бинарных деревьев
- •Сортировка с прохождением бинарного дерева
Бинарные деревья
Бинарные деревья - это конечное множество элементов, которое либо пусто, либо состоит из корня с двумя отдельными двоичными деревьями, которые называются левым/правым поддеревом.
Пример - генеалогическое дерево, где у каждого человека есть потомки в лице отца и матери, арифметическое выражение с бинарными операциями, где каждому оператору соответствует вершина, а операнды - поддеревья.
(а + b)*с
* | / \ | + с | / \ | a b | |
+ | / \ | a b | | | |
* | / \ | (a+b) с | | | |
Полное бинарное дерево уровня n - это дерево, в котором каждый узел уровня n является листом и каждый узел уровня меньше n имеет непустые левое и правое поддеревья
Реализация бинарных деревьев
Бинарные деревья достаточно просто могут быть представлены в виде списков или массивов.
В виде массива проще всего представляется полное бинарное дерево, так как оно всегда имеет строго определенное число вершин на каждом уровне. Вершины можно пронумеровать слева направо последовательно по уровням и использовать эти номера в качестве индексов в одномерном массиве.
Однако далеко не все бинарные деревья являются полными. Для неполных бинарных деревьев применяют следующий способ представления. Бинарное дерево дополняется до полного дерева, вершины последовательно нумеруются. В массив заносятся только те вершины, которые были в исходном неполном дереве. При таком представлении элемент массива выделяется независимо от того, будет ли он содержать узел исходного дерева. Следовательно, необходимо отметить неиспользуемые элементы массива. Это можно сделать занесением специального значения в соответствующие элементы массива. В результате структура дерева переносится в одномерный массив.
У элемента с индексом i потомками являются элементы с индексами 2i и 2i+1. Адрес любой вершины в массиве вычисляется как адрес равный 2k-1+i-1, где k — номер уровня вершины, i — номер на уровне k в полном бинарном дереве. Адрес корня будет равен единице.
Главным недостатком рассмотренного способа представления бинарного дерева является то, что структура данных является статической. Размер массива выбирается исходя из максимально возможного количества уровней бинарного дерева. Причем чем менее полным является дерево, тем менее рационально используется память.
Кроме массива необходимо иметь переменную, которая определяет количество элементов в дереве.
Если число уровней дерева в процессе обработки не будет существенно изменяться, то такой способ представления полного бинарного дерева будет значительно более экономичным, чем любая списковая структура.
Списочное представление бинарных деревьев основано на элементах, соответствующих узлам дерева. Каждый элемент имеет поле данных и два поля указателей. Один указатель используется для связывания элемента с правым потомком, а другой — с левым. Листья имеют пустые указатели потомков. При таком способе представления дерева обязательно следует сохранять указатель на узел, являющийся корнем дерева.
Type
TAddrUzla=^TUzel;
TUzel=record
znach: integer;
l,r: ukaz;
end;
Var
addrKornia, addrUzla: TAddrUzla;
n: integer;
Begin
readln(n);
addrKornia:=nil;
new(addrUzla);
addrKornia:= addrUzla;
addrUzla^.znach:=n;
addrUzla^.l:=nil;
addrUzla^.r:= nil;
End.