• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Уточнение: является ли деревом сортировки

Asya_inter

Новые
Регистрация
12 Янв 2015
Сообщения
71
Реакции
0
Баллы
0
Уточнение: является ли деревом сортировки

Здравствуйте, проверьте пожалуйста. Верно ли сделано? Дано такое задание: Построить двоичное дерево сортировки.

Вот решение:
Код:
program trees;

type
   pTree = ^Tree;
   Tree = record
      name: integer;
      left: pTree;
      right: pTree
   end;

var
   s: integer;
   t: pTree;
   n, i: integer;

procedure insert(var T: pTree; x: integer);
begin
   if T = nil then begin
      new(T);
      T^.name := x;
      T^.left := nil;
      T^.right := nil;
   end
   else  if T^.name >= x then
      insert(t^.left, x)  
   else insert(t^.right, x);
end;

procedure obhod(t: Ptree);
begin
   if T <> nil then begin
      obhod(T^.left);
      write(t^.name,',');
      obhod(t^.right);
   end;
end;

begin
   write('kol-vo chisel: ');
   read(n);
   t := nil;
   for i := 1 to n do 
   begin
      read(s);
      insert(t, s);
   end;
   write('result. sortirovki: ');
   obhod(t);
   readln;
end.
 
На первый взгляд все верно, единственное по уму надо бы дерево в конце программы "разрушить", т.е. освободить память, но для данного примера это не критично, ну и концептуально, я бы в основной программе не стал вводить количество вводимых цифр, а заканчивал бы ввод спецсимволом, т.е. если например введен "!" (естественно тогда переменная s должна быть char и после проверки на ! ее надо преобразовывать в integer) - то закончить ввод и вывести дерево ...
 
MagentaTiger, спасибо!
Я переделала, но наверное неправильно... Поясните, не совсем поняла - если тип char, то воспринимаются только цифры. А ещё будьте добры, расскажите как освободить память?
Код:
program trees;

type
   pTree = ^Tree;
   Tree = record
      name: char;
      left: pTree;
      right: pTree
   end;

var
   s: char;
   t: pTree;
   n, i: integer;

procedure insert(var T: pTree; x: char);
begin
   if T = nil then begin
      new(T);
      T^.name := x;
      T^.left := nil;
      T^.right := nil;
   end
   else  if T^.name >= x then
      insert(t^.left, x)  
   else insert(t^.right, x);
end;

procedure obhod(t: Ptree);
begin
   if T <> nil then begin
      obhod(T^.left);
      write(t^.name,',');
      obhod(t^.right);
   end;
end;

begin
   write('vvedi chisla: ');
   repeat 
  
      read(s);
      insert(t, s);
   until s='!';
   write('result. sortirovki: ');
   obhod(t);
   readln;
end.
 
А ещё, такой вот вопрос: можно ли относительно данной задачи, решить ещё одну: Посчитать разность для каждой вершины полученного дерева между количеством левых и правых поддеревьев. . Как я поняла, там требуется посчитать количество левых и правых у каждой. Ну это ещё понятно вроде как сделать, но как ответ оформить?? Что на выходе должно быть?
 
Назад
Сверху