Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ ЛР.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
128 Кб
Скачать

Работа 5. Бинарные деревья. Рекурсивный алгоритм обработки

В данной работе для прохождения по дереву используется рекурсивный вызов процедуры/функции.

Пример реализации задания:

program ds_05;

uses ds_unit;

var t: ptree;

cnt: integer;

function cnt_node(t:ptree):integer;

{ Входы: t - бинарное дерево;

Выходы: cnt_node - кол. элементов в дереве;

Гл. имена: ptree - тип указателя на дерево;

llink,rlink - поля связи элемента дерева;

Функция: Определение кол. эл-тов в дереве t.

}

begin

if t=nil then begin cnt_node:=0; exit end;

cnt_node:=1 + cnt_node(t^.llink) + cnt_node(t^.rlink); {два рекурсивных вызова}

end; {cnt_node}

begin

gentree(t);

puttree(t);

writeln('Количество элементов в дереве: ',cnt_node(t));

escwait;

end.

Варианты индивидуальных заданий:

1. Определение количества уровней дерева.

2. Преобразование арифметического выражения, заданного в виде бинарного дерева, в постфиксную форму в строковом представлении.

3. Копирование дерева.

4. Создание списка с значениями элементов, находящимися на заданном уровне дерева.

5. Исключение из дерева всех элементов, находящихся на уровнях, превышающих заданный.

6. Преобразование дерева исключением всех его листьев.

7. Преобразование упорядоченного дерева в упорядоченное дерево с тем же составом элементов, но с меньшим количеством уровней.

Приложение. Текст модуля DS_Unit

UNIT DS_UNIT;

interface

uses crt;

const m=7; { Размер блока памяти выделенного

для представления списков }

var info: array[1..m] of integer;{ Массив полей информации }

link: array[1..m] of integer;{ Массив полей связи для представления списков }

avail: integer; { Список свободного пр-ва }

type plist = ^list; { Тип указателя на список }

list = record { Тип элемента списка }

info: integer; { Поле информации }

link: plist; { поле связи элеменета списка}

end;

type ptree = ^tree; { Тип указателя на дерево }

tree = record { Тип элемента дерева }

llink,rlink: ptree; { Левое и правое поля связи элемента дерева }

info: char; {Поле информации элемента}

end; { дерева }

procedure escwait; { Приостановка выполнения программы }

procedure rdblock; { Ввод и }

procedure wrblock; { вывод состояния блока памяти }

{ для представления списков }

procedure rdlist(var lst: plist); { Ввод и }

procedure wrlist(lst: plist); { вывод списка lst }

procedure gentree(var t:ptree); { Ввод и }

procedure puttree(t:ptree); { вывод дерева t }

implementation

procedure escwait;

var fin: Boolean;

begin

writeln;

writeln('Нажмите Esc для продолжения программы.');

repeat

repeat until keypressed;

fin:=ord(readkey)=27;

until fin;

end; {escwait}

procedure rdblock;

var i: integer;

begin

writeln;

writeln('Ввод состояния блока памяти...');

writeln(' В строках Info и Link вводите по ',m:2,' чисел,');

writeln(' разделяя их пробелами...');

write(' ');

for i:=1 to m do write(i:3);

writeln; write('Info: ');

for i:=1 to m do read(info[i]);

write('Link: ');

for i:=1 to m do read(link[i]);

write('Avail: '); readln(avail); writeln;

end; {rdblock}

procedure wrblock;

var i: integer;

begin

writeln; writeln('Состояние блока памяти...');

write(' ');

for i:=1 to m do write(i:3);

writeln; write('Info: ');

for i:=1 to m do write(info[i]:3);

writeln;

write('Link: ');

for i:=1 to m do write(link[i]:3);

writeln; writeln('Avail: ',avail);

end; {wrblock}

procedure rdlist(var lst: plist);

var p,q,s: plist;

buf: integer;

function rdint(var buf:integer):Boolean;

begin

{$i-}

read(buf);

rdint:=IOResult=0;

{$i+}

end; {rdint}

begin

writeln;

writeln('Ввод списка... ');

writeln(' Вводите элементы списка (целые числа),');

writeln(' разделяя их пробелами. За последним');

writeln(' числом списка введите пробел, точку и Enter!');

q:=nil;

while rdint(buf) do

begin

new(s);

s^.info:=buf;

s^.link:=q;

q:=s;

end;

p:=nil;

while q<>nil do

begin

s:=q; q:=q^.link;

s^.link:=p; p:=s;

end;

lst:=p;

end; {rdlist}

procedure wrlist(lst: plist);

var p: plist;

begin

write('Список: [');

p:=lst;

while p<>nil do

begin

if p<>lst then write(',');

write(p^.info);

p:=p^.link;

end;

writeln(']');

end; {wrlist}

procedure gentree(var t:ptree);

procedure gent(var t:ptree);

var ch: char;

begin

read(ch);

if ch='.' then begin t:=nil; exit end;

new(t); t^.info:=ch;

gent(t^.llink);

gent(t^.rlink);

end; {gent}

begin

writeln;

writeln('Ввод дерева в точечной форме');

writeln(' ( например, AB..C.. )...');

gent(t);

readln;

writeln;

end; {gentree}

procedure puttree(t:ptree);

procedure putt(t:ptree);

begin

if t=nil then begin write('.'); exit end;

write(t^.info);

putt(t^.llink);

putt(t^.rlink);

end; {putt}

begin

writeln;

writeln('Дерево:');

putt(t);

writeln;

end; {puttree}

end.