Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lec_inf.doc
Скачиваний:
61
Добавлен:
16.03.2015
Размер:
1.14 Mб
Скачать

7.5.3. Деревья выражений

Дерево выражений– бинарное дерево, в корневых узлах которого хранятся признаки операций, а в терминальных узлах – операнды выражения (переменные или константы). Дерево выражений представлено на рис. 73.

Рис. 73. Дерево выражений

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

Нисходящему обходу соответствует префиксная формапредставления, т. к. в ней знак операции предшествует операнду:

* + А 10. / B 5.2 .

Восходящему обходу соответствует постфиксная форма представления, т. к. в ней знак операции находится после операндов:

A 10. + B 5.2 / * .

Смешанному обходу соответствует инфиксная форма представления, т. к. в ней знак операции находится между операндами:

А + 10. * В / 5.2 .

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

( ( A + 10. ) * ( B / 5.2)).

На рис. 74 приведено дерево, смешанный обход которого позволяет получить бесскобочную инфиксную форму, эквивалентную дереву рис. 73, а скобочная инфиксная форма задает совсем другие приоритеты операций. Заметим, что подобная проблема не может возникнуть при использовании префиксной или постфиксной формы представления выражения.

(А + ( 10. * ( В / 5.2 ) ) )

Рис. . Дерево выражений

Какой алгоритм обхода необходимо использовать для того, чтобы подсчитать значение арифметического выражения, представленного в виде дерева?

7.6. Программный модуль, реализующий операции

создания, обработки, просмотра содержимого

бинарного дерева (на примере сбалансированного дерева)

Uses Crt;

Type

PTree = ^ Tree;

{ тип – указатель на узел сбалансированного дерева }

Tree = record

{ тип – элемент хранения узла сбалансированного дерева }

info: word;

left, right: PTree

end;

var f: PTree; cod,n: byte; sum: word;

Procedure Balance( var root: PTree;

{ root – указатель на корень дерева, }

n: byte );

{ n – количество узлов в дереве }

begin

if n = 0 then root:=nil

{ если n = 0, построить пустое дерево }

else begin

new( root );

{ создать корень дерева }

write( ‘Значение информационного поля узла дерева = ‘ );

readln( root^.info );

{ заполнить информационное поле корня }

Balance( root^.left, n div 2);

{ построить левое поддерево}

Balance( root^.right, n – n div 2 – 1)

{ построить правое поддерево }

end

end;

Procedure Print( root: PTree );

{ просмотр информац. полей узлов дерева - }

begin

{ нисходящий обход }

if root <> nil then begin

writeln( ‘Информационное поле узла дерева = ‘, root^.info );

Print( root^.left );

{ просмотреть левое поддерево }

Print( root^.right );

{ просмотреть правое поддерево }

end;

end;

Procedure Work( root: PTree; var s: word );

{ суммирование значений информ. }

begin

{ полей узлов дерева – смешанный обход }

if root <> nil then begin

Work( root^.left );

{ обработать левое поддерево }

s:=s + root^.info;

{ суммирование значений инф. полей узлов }

Work( root^.right );

{ обработать правое поддерево }

end;

end;

Procedure Destroy( var root: PTree );

{ разрушение дерева }

begin

. . .

end;

Procedure Message;

{ вспомогательная процедура }

begin

writeln( ‘Дерево пусто‘ ); write( ‘Нажмите любую клавишу‘ ); readkey

end;

begin

f:=nil;

{ первоначально дерево пусто }

repeat Clrscr;

writeln(‘1-Создание 2-Просмотр 3–Обработка 4–Разрушение 5-Выход‘ );

write( ‘Код действия = ‘ ); readln( cod );

case cod of

1: begin

{ создание сбалансированного дерева }

write( ‘Количество узлов в дереве = ‘ ); readln( n );

Balance( f,n ); write( ‘Нажмите любую клавишу‘ ); readkey

end;

2: begin

{ просмотр дерева }

if f=nil then Message

else begin

Print( f ); write( ‘Нажмите любую клавишу‘ ); readkey

end;

3: begin

{ обработка дерева }

if f=nil then Message

else begin

sum:=0;

{ инициализация значения глобальной переменной }

Work( f,sum ); writeln( ‘Сумма значений инф. полей = ‘, sum );

write( ‘Нажмите любую клавишу‘ ); readkey

end;

4: begin

{ разрушение дерева }

if f=nil then Message

else begin

Destroy( f ); writeln( ‘Дерево разрушено‘ );

write( ‘Нажмите любую клавишу‘ ); readkey

end;

5: Destroy( f )

{ выход }

end;

until ( cod = 5 ); Clrscr

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]