
- •Введение
- •Типовое задание
- •Содержание отчета
- •Работа 1. Списки. Представление однородными массивами фиксированного размера
- •Работа 2. Списки. Реализация с помощью динамических переменных
- •Работа 3. Списки. Рекурсивный алгоритм обработки
- •Работа 5. Бинарные деревья. Рекурсивный алгоритм обработки
- •Библиографический список
- •600000, Владимир, ул. Горького, 87
Работа 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.