Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САОД Part 1.DOC
Скачиваний:
41
Добавлен:
02.11.2018
Размер:
1.68 Mб
Скачать
  1. Дерево выражения

Часто информация, содержащаяся в узлах бинарного дерева, имеет отличающиеся атрибуты либо различное назначение. Такие деревья называются разнородными. Примером разнородного дерева является дерево, используемое для вычисления арифметических выражений.

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

При построении дерева префиксная запись сканируется слева направо и дерево строится также слева направо.

Рекурсивный алгоритм построения дерева выражения может быть описан следующим образом:

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