Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2015, 14:06   #1
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию Подсчёт количества вершин у двоичного дерева

Подскажите, пожалуйста! Как можно осуществить и как ответ оформить?2) Посчитать разность для каждой вершины полученного дерева между количеством левых и правых поддеревьев. .Что на выходе должно быть?(ведь может быть огромное количество вершин в дереве). У меня была такая задача:1) Построить двоичное дерево сортировки. - вроде её получилось сделать( не знаю на сколько правильно, но вроде работает) И относительно её хотелось бы вторую сделать. Так можно наверное?
Код:
program z_1;

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.
Asya7 вне форума Ответить с цитированием
Старый 28.08.2015, 15:44   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

уговорили, отвечу я, коль остальные молчат :-D
Оформить ответ я не знаю как, но реализовал бы два варианта: вывод для каждой вершины и вывод только для корневого узла.... а там уже пусть препод выбирает, благо что почти тот же код и можно тупо скопировать код одного варианта и допилить до второго)
Про реализацию: фактически, за основу бери код obhod-a.... новая ф-ия должна возвращать количество вершин указанного узла т. е. если вызвали для корня - вернёт общее число узлов дерева, если вызвали для левого/правого узла - вернёт общее число узлов левого/правого поддерева, если вызвали на nil - вернёт 0.... думаю, что сможешь реализовать, там та же рекурсия, что и в obhod)
Главное отличие при выводе ответа: если мы считаем только разность левого и правого узла корня, то всё как выше написал, без особых заморочек..... если вывод для каждого узла, то просто в нашей новой функции сохраняем к-во узлов лево/право, выводим разницу, а потом просто возвращаем сумму лево/право..... отличие лишь в наличие вывода, а так-то тот же код
GreenWizard вне форума Ответить с цитированием
Старый 28.08.2015, 17:46   #3
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

GreenWizard, спасибо за объяснения! Буду пробовать реализовать.
Asya7 вне форума Ответить с цитированием
Старый 28.08.2015, 18:33   #4
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от Asya7 Посмотреть сообщение
GreenWizard, спасибо за объяснения! Буду пробовать реализовать.
если что, пиши в ВК или Асю, помогу с кодом
GreenWizard вне форума Ответить с цитированием
Старый 29.08.2015, 18:40   #5
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Только сейчас что-то получилось, но это не совсем то.. Помогите, если может кто. Пожалуйста!
Код:
(*6) Посчитать разность для каждой вершины полученного дерева
 между количеством левых и правых поддеревьев.*)
program z_5;

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

var
   a, r, l, k, s: integer;
   t: pTree;


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;

procedure postorder(p: ptree; g: integer);
begin
   if p^.left <> nil then postorder(p^.left, k + 1);
   k := k + 1;
   if p^.right <> nil then postorder(p^.right, k + 1);
end;

procedure LV(p: ptree; g: integer);
begin
   if p^.left <> nil then LV(p^.left, l + 1);
   l := l + 1;
   if p^.right <> nil then LV(p^.right, l + 1);   
end;

procedure RV(p: ptree; g: integer);
begin
   if p^.left <> nil then RV(p^.left, r + 1);
   r := r + 1;
   if p^.right <> nil then RV(p^.right, r + 1);
end;


begin
   a := 0;
   write('vvedi chisla: ');
   repeat 
      read(s);
      insert(t, s);
   until s = 112;
   write('result. sortirovki: ');  
   obhod(t);  
   writeln;
   if (t^.right <> nil) or (t^.left <> nil) then
      postorder(t, a);
   if t^.left <> nil then LV(t^.left, a);
   if t^.right <> nil then RV(t^.right, a);
   
   writeln('vsego vershin:', k); 
   writeln('right vershin:', r);
   writeln('left vershin:', l);
   writeln('difference:', abs(l - r));
   readln;
end.
Если можно, то объясните, а как можно найти количество вершин для какого-нибудь элемента в дереве( я не совсем понимаю, они вроде никак не пронумерованы конкретно. Или это через цикл делается - вычитая из кол-ва всех элементов и дойдя до нужного... -ПОЯСНИТЕ, ЕСЛИ ЗНАЕТЕ. .. и эта нумерация - связана ли со способом обхода дерева?) Точно! Вот ещё: был такой момент: после написания команды вывода в самой процедуре (получилось случайно) , то вывелись разные цифры - так это наверное и есть вершины для каждого поддерева?? Или это не то? Ну в общем вывести для каждого - совсем не получается.. Подскажите как?(
Asya7 вне форума Ответить с цитированием
Старый 29.08.2015, 18:55   #6
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

1) случайные т. к. нужно не полагаться на компилятор, а в начале работы присвоить им 0
2) особого порядка нет.... это.похоже на организацию некой фирмы: есть глава и от 0 до 2 замов, а у них от 0 до 2 помошников.... нужно просто посчитать количество подчинённых у узла/человека
3) умница, конечно, что сделала на глобальных переменных, но перепиши на одну функцию... будет намного проще и меньше кода
GreenWizard вне форума Ответить с цитированием
Старый 29.08.2015, 19:14   #7
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Всё понятно! Да, я переделаю - в одну функцию. Огромное спасибо!
Asya7 вне форума Ответить с цитированием
Старый 29.08.2015, 19:24   #8
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Код:
   if t^.left <> nil then LV(t^.left, a);
   if t^.right <> nil then RV(t^.right, a);
   
   writeln('vsego vershin:', k); 
   writeln('right vershin:', r);
   writeln('left vershin:', l);
   writeln('difference:', abs(l - r));
должно стать:
Код:
   l := countNodes(t^.left);
   r := countNodes(t^.right);
   
   writeln('vsego vershin:', l + r + 1); 
   writeln('right vershin:', r);
   writeln('left vershin:', l);
   writeln('difference:', abs(l - r));
хотя я бы ещё проверял не nil ли t + abs тут не нужно т. к. тогда не понять куда дерево "перекошено"
GreenWizard вне форума Ответить с цитированием
Старый 29.08.2015, 20:24   #9
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Уже всё переделано как нужно - спасибо Вам!
Asya7 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход прошитого двоичного дерева iluxa1810 Общие вопросы C/C++ 1 13.05.2015 20:42
Подсчет количества вершин на каждом уровне дерева Sauber C++ Builder 1 25.11.2011 08:15
Поиск двоичного дерева mtg Общие вопросы C/C++ 2 01.12.2010 21:15
Обход двоичного дерева слева Дядя Тёма Помощь студентам 0 05.06.2010 18:25
Обход двоичного дерева F1nk Помощь студентам 0 03.06.2010 17:51