Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 25.08.2015, 17:03   #1 (permalink)
Asya_inter
Member
 
Аватар для Asya_inter
 
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Уточнение: является ли деревом сортировки

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

Вот решение:
Код:
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.
Asya_inter вне форума   Ответить с цитированием

Старый 25.08.2015, 17:03
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Данные топики очень похожи по содержанию на вашу тему

Ключ сортировки – любой, алгоритм сортировки – пузырек
Compaq Presario CQ57: уточнение модели - из 16 вариантов
Моддинг деревом
Работы с деревом (фанерой)
Методы сортировки

Старый 25.08.2015, 17:22   #2 (permalink)
MagentaTiger
Специалист
 
Аватар для MagentaTiger
 
Регистрация: 27.04.2015
Адрес: Москва
Сообщений: 1,423
Записей в дневнике: 4
Сказал(а) спасибо: 52
Поблагодарили 53 раз(а) в 16 сообщениях
Репутация: 18120
По умолчанию

На первый взгляд все верно, единственное по уму надо бы дерево в конце программы "разрушить", т.е. освободить память, но для данного примера это не критично, ну и концептуально, я бы в основной программе не стал вводить количество вводимых цифр, а заканчивал бы ввод спецсимволом, т.е. если например введен "!" (естественно тогда переменная s должна быть char и после проверки на ! ее надо преобразовывать в integer) - то закончить ввод и вывести дерево ...
MagentaTiger вне форума   Ответить с цитированием
Старый 25.08.2015, 17:48   #3 (permalink)
Asya_inter
Member
 
Аватар для Asya_inter
 
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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.
Asya_inter вне форума   Ответить с цитированием
Старый 25.08.2015, 18:37   #4 (permalink)
Asya_inter
Member
 
Аватар для Asya_inter
 
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

А ещё, такой вот вопрос: можно ли относительно данной задачи, решить ещё одну: Посчитать разность для каждой вершины полученного дерева между количеством левых и правых поддеревьев. . Как я поняла, там требуется посчитать количество левых и правых у каждой. Ну это ещё понятно вроде как сделать, но как ответ оформить?? Что на выходе должно быть?
Asya_inter вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
free pascal, помощь, проверить

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 14:55.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.