Программа


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.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию