Программа
PROGRAM Woodcutter(input,output);
TYPE RefType=^Point; { Тип - ссылка на дерево }
Point=record { Элемент дерева }
N:real;
R,L:RefType
end;
L_R=(L,R); { Тип - флаг для определения выводимого поддерева }
Str=packed array [1..15] of char; { Строка }
VAR Tree:RefType; { Дерево }
Flag:L_R; { Флаг выводимого поддерева }
FUNCTION Question(S:str):boolean; { Функция получения ответа на вопрос }
Var Ch:char; { Буфер }
Begin
repeat
Write(S,' [Y/N] '); { Вывод вопроса }
ReadLn(Ch) { Ввод символа }
until Ch in ['Y','y','N','n','Н','н','Т','т'];
{ Выход из цикла при получении корректного ответа }
Question:=Ch in ['Y','y','Н','н'] { Определение значения функции }
End;
(*
PROCEDURE InputTree(var Ref:RefType;Level:integer;Flag:L_R);
{ Процедура ввода дерева }
Begin
Ref:=nil; { Сброс ссылки }
if Level<4 then { Ограничение высоты дерева }
begin
{ Вывод подсказки: }
Write('Уровень ',Level);
if Flag=L then WriteLn(' "левый" от предыдущего ')
else WriteLn(' "правый" от предыдущего ');
if Question('Ввести элемент?') { Получение ответа на вопрос }
then begin
New(Ref); { Создание элемента }
Write('Введите значение элемента '); { Вывод приглашения }
ReadLn(Ref^.N); { Инициализация элемента }
{ Ввод поддеревьев: }
InputTree(Ref^.L,Level+1,L);
InputTree(Ref^.R,Level+1,R)
end
end
End;
*)
PROCEDURE InputTree(var Ref:RefType;Level:integer;Flag:L_R);
{ Процедура ввода дерева }
Begin
if Level=0 then Randomize;
Ref:=nil; { Сброс ссылки }
if Level<4 then { Ограничение высоты дерева }
if Random(3)>0
then begin
New(Ref); { Создание элемента }
Ref^.N:=Random*100; { Инициализация элемента }
{ Ввод поддеревьев: }
InputTree(Ref^.L,Level+1,L);
InputTree(Ref^.R,Level+1,R)
end
End;
PROCEDURE OutputTree(Ref:RefType;Level:integer;Flag:L_R); { Процедура вывода дерева }
Var i:integer; { Счетчик форматирующих пробелов }
Begin
if Ref<>nil { Проверка существованияэлемента }
then begin
if Flag=L then for i:=1 to Level do Write(' ');
{ Вывод форматирующих пробелов }
Write(Ref^.N:10:5,' '); { Вывод элемента }
{ Вывод поддеревьев: }
OutputTree(Ref^.R,Level+1,R);
OutputTree(Ref^.L,Level+1,L)
end
else if Flag=R then WriteLn
{ Завершение строки после "невывода" правого пустого поддерева }
End;
PROCEDURE GetMinMax(Tree:RefType;var MinRef,MaxRef:RefType);
{ Процедура поиска минимального и максимального элементов }
Begin
if Tree<>nil then { Проверка существования элемента }
begin
{ Сравнение элементов и переопределение ссылок }
if MinRef^.N>Tree^.N
then MinRef:=Tree
else if MaxRef^.N<Tree^.N then MaxRef:=Tree;
{ Поиска минимального и максимального элементов в под деревьях: }
GetMinMax(Tree^.R,MinRef,MaxRef);
GetMinMax(Tree^.L,MinRef,MaxRef)
end
End;
PROCEDURE ChangeMinMax(Tree:RefType);
{ Процедура перестановки минимального и максимального элементов }
Var MinRef,MaxRef:RefType; { Ссылки на максимальный и минимальный элементы }
Buf:real; { Буфер для обмена }
Begin
if Tree<>nil then
begin
{ Начальное определение ссылок: }
MinRef:=Tree;
MaxRef:=Tree;
GetMinMax(Tree,MinRef,MaxRef); { Получение ссылок на Max и Min элементы }
{ Перестановка элементов: }
Buf:=MinRef^.N;
MinRef^.N:=MaxRef^.N;
MaxRef^.N:=Buf
end;
End;
PROCEDURE DisposerTree(var L:RefType); { Процедура удаления дерева }
Begin
if L<>nil then begin { Если переменная существует, то }
{ удаление поддеревьев: }
DisposerTree(L^.R);
DisposerTree(L^.L);
Dispose(L); { удаление переменной }
L:=nil { Переопределение ссылки }
end
End;
BEGIN
WriteLn; { Пропуск строки }
InputTree(Tree,0,L); { Ввод дерева }
WriteLn('ИСХОДНОЕ ДЕРЕВО'); { Вывод заголовка }
WriteLn('---------------'); { Вывод заголовка }
OutputTree(Tree,0,R); { Вывод дерева }
ChangeMinMax(Tree); { Перестановка минимального и максимального элементов }
WriteLn('РЕЗУЛЬТИРУЮЩЕЕ ДЕРЕВО'); { Вывод заголовка }
WriteLn('---------------------'); { Вывод заголовка }
OutputTree(Tree,0,R); { Вывод дерева }
DisposerTree(Tree) { Удаление дерева }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию