- •Тема 1. Стеки, очереди, деки 7
- •Тема 2. Односвязные и двусвязные линейные списки 21
- •Тема 3. Бинарные деревья 40
- •Тема 4. Графы 65
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4. Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
-
Дерево выражения
Часто информация, содержащаяся в узлах бинарного дерева, имеет отличающиеся атрибуты либо различное назначение. Такие деревья называются разнородными. Примером разнородного дерева является дерево, используемое для вычисления арифметических выражений.
Дерево выражения можно строить по инфиксной записи, но при этом алгоритм построения должен учитывать приоритеты выполнения операций и наличие скобок. Более простым путем является предварительное преобразование арифметического выражения из инфиксной записи в префиксную с использованием стека.
При построении дерева префиксная запись сканируется слева направо и дерево строится также слева направо.
Рекурсивный алгоритм построения дерева выражения может быть описан следующим образом:
1) получить очередной символ префиксной записи выражения и поместить его в узел дерева;
2) если этот символ – операция,
то построить таким же способом его левое поддерево,
построить таким же способом его правое поддерево,
иначе конец алгоритма.
Дерево выражения может строиться и по постфиксной записи, в этом случае запись выражения сканируется справа налево и дерево строится также справа налево.
Дерево выражения может быть реализовано как наследник бинарного дерева с символьным или строковым значением содержательного поля Value элемента дерева. Метод Build дерева выражения перекрывает одноименный метод бинарного дерева, так как реализуется иначе; все остальные методы бинарного дерева наследуются.
type
tOperatorSet = set of '*' .. '/'; // тип - множество операторов
tExprTree = class(tBinaryTree) // класс - дерево выражения
private
fOperators: tOperatorSet; // поле - множество операторов
public
function IsOperator(ExprEl: tValue):Boolean; // элемент выражения - оператор?
procedure Build(var f: Text); // построение дерева выражения
constructor Create; // создание пустого дерева
end; // tExprTree
Метод IsOperator проверяет, принадлежит ли очередной элемент выражения к множеству допустимых операторов fOperators. Метод Build дерева выражения перекрывает одноименный метод бинарного дерева, так как реализуется иначе. Конструктор Create помимо создания пустого дерева задает множество Operators разрешенных в данном выражении операторов. Остальные методы бинарного дерева наследуются.
В простейшем случае – для операндов и операторов, представляемых одним символом, – процедура построения дерева выражения по его префиксной записи, хранящейся в текстовом файле, имеет вид:
procedure TExprTree.Build(var f: Text);
// Построение дерева выражения по его префиксной записи в файле f
function BuildTree: pItem; // рекурсивная функция построения
var
Item: pItem; // элемент дерева выражения
Symbol: tValue; // символ выражения
begin
if not Eof(f)
then begin
Read(f, Symbol); if Eoln(f) then ReadLn(f);
Item:= New(pItem); Item^.Value:= Symbol;
if IsOperator(Symbol)
then begin // cимвол - оператор
Item^.Left:= BuildTree; Item^.Right:= BuildTree; end
else begin // cимвол - операнд
Item^.Left:= Nil; Item^.Right:=nil;
end;
BuildTree:= Item;
end;
end; // function BuildTree
begin
fRoot:= BuildTree;
end; // procedure TExprTree.Build