Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2_SAOD_-_Dinamicheskie_struktury_dannykh.doc
Скачиваний:
120
Добавлен:
21.03.2016
Размер:
1.66 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разрешенных в данном выражении операторов. Все остальные методы бинарного дерева наследуются.

В простейшем случае – для операндов и операторов, представляемых одним символом, – процедура построения дерева выражения по его префиксной записи, хранящейся в текстовом файле, имеет вид:

procedureTExprTree.Build(var f: Text);

// Построение дерева выражения по его префиксной записи в файле f

functionBuildTree: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