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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2012, 19:58   #1
Madmaxisss
Форумчанин
 
Регистрация: 12.07.2011
Сообщений: 158
По умолчанию подсчет уровней в дереве

подсчет уровней в бинарном дереве

Код:
// в момент прохода kk:=1;
PROCEDURE  PRO_URO (tt :tree; kk :integer); 
begin
   if (tt^.pll<>nil) then 
      begin 
         inc(kk); 
         PRO_URO(tt^.pll,kk); 
      end;

   if (tt^.prr<>nil) then 
      begin 
         inc(kk); 
         PRO_URO(tt^.prr,kk); 
      end;

   write('>>',kk); // почему то не правильно, помогите плиз (должно выводить уровни по каждой ветке т.е. уровней kk  от tt до листка)
   kk:=1;

//pll - лево 
//prr - право
end;

Последний раз редактировалось Madmaxisss; 07.09.2012 в 20:51.
Madmaxisss вне форума Ответить с цитированием
Старый 07.09.2012, 20:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
почему то не правильно
А как код себя ведет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.09.2012, 20:49   #3
Madmaxisss
Форумчанин
 
Регистрация: 12.07.2011
Сообщений: 158
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А как код себя ведет?
Код:
                                 1
                       2                  2
                  3        3          3      3
                4   4               4  4
должно быть:
>>4>>4>>3>>4>>4>>3


а получается:
>>4>>5>>5>>4>>4>>5>>6>>6>>5>>5>>3

Последний раз редактировалось Madmaxisss; 07.09.2012 в 20:54.
Madmaxisss вне форума Ответить с цитированием
Старый 07.09.2012, 20:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
должно быть:
>>4>>4>>3>>4>>4>>3
Как так? Не уловил логики
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.09.2012, 21:03   #5
Madmaxisss
Форумчанин
 
Регистрация: 12.07.2011
Сообщений: 158
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Как так? Не уловил логики
от узла tt до листка N увеличиваем kk, как дошли до листка вывели kk, после чего kk:=1, и опять повторяем итерацию.
Madmaxisss вне форума Ответить с цитированием
Старый 07.09.2012, 21:07   #6
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

А кто сказал, что алгоритм считает уровни?
Как минимум
Код:
PROCEDURE  PRO_URO (tt :tree; kk :integer);
А для передачи параметра, надо
Код:
PROCEDURE  PRO_URO (tt :tree; VAR kk :integer);
Во-вторых.
Что у вас вообще считается? Сначала погружение влево до тупика, потом выход из рекурсии и погружение вправо через лево и так опять до тупика. Эдак вы просто посчитаете все узлы. но не уровни.

По логике еще вот что, Если вы влево уперлись в тупик - вы ничего не увидите, так как сразу погружаетесь вправо, и только из правого тупика вы выводите что-то. Тогда уж надо вывод делать после каждого тупик.

Код:
// в момент прохода kk:=1;
PROCEDURE  PRO_URO (tt :tree; var kk :integer); 
begin
   if (tt^.pll<>nil) then 
      begin 
         inc(kk); 
         PRO_URO(tt^.pll,kk); 
      end;


   write('>>',kk); // вывод при достижении левого тупика


   if (tt^.prr<>nil) then 
      begin 
         inc(kk); 
         PRO_URO(tt^.prr,kk); 
      end;

   write('>>',kk); // вывод при достижении правого тупика.)
   kk:=1; ??????? по логике это присвоение лишнее, Так как откат из рекурсии восстанавливает К на том уровне, на каком погрузились и это верно. Зачем его сбивать в 1?

//pll - лево 
//prr - право
end;

и еще для раздумий - у вас алгоритм идет ЛЕВО_ЛЕВО-ТУПИК-ПРАВ-ЛЕВО-ЛЕВО-ТУПИК-ПРАВО-ЛЕВО-ТУПИК...
Подумайте, что вы этим считаете.


И вот это не понял

Цитата:
должно быть:
>>4>>4>>3>>4>>4>>3


а получается:
>>4>>5>>5>>4>>4>>5>>6>>6>>5>>5>>3
Где в вашем дереве пятерка и почему начало с 4-ки?
я не вижу столько уровней

Цитата:
1
2 2
3 3 3 3
4 4 4 4
Как я читаю алгоритм 1-2-3 - тупик (3), выхода на 1-2-3-4 снова (4) - тупик, выход на 3: 1-2-3-4 (4), выход на уровень 1. Потом почти тоже самое. Жаль цифры одинаковые. ТО есть получится вывод:
4-4-3-4-4-3. При условии правильной передачи параметров и вывода в обоих местах. При вашем алгоритме вывод только после правого. Будет, без передачи параметров постоянно 1-1-1-1-1-1.


Мне видится так код правильнее
Код:
...
kk:=1;
....
PRO_URO (mytrre,kk);
.....

PROCEDURE  PRO_URO (tt :tree; var kk :integer); 
begin
   if (tt^.pll<>nil) then 
      begin 
         inc(kk); 
         PRO_URO(tt^.pll,kk); 
      end;

   write('>>',kk); // вывод при достижении левого тупика

   if (tt^.prr<>nil) then 
      begin 
         inc(kk); 
         PRO_URO(tt^.prr,kk); 
      end;

   write('>>',kk); // вывод при достижении правого тупика.)

end;
и это пройдет...

Последний раз редактировалось grenles; 07.09.2012 в 21:21.
grenles вне форума Ответить с цитированием
Старый 07.09.2012, 21:21   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Без отладки трудно сказать (а код для построения дерева писать лень), но примерно такие изменения (ИМХО, конечно, могу ошибаться):
1) убрать inc(kk); - иначе в узлах где два листа дублироваться будет
2) вызов процедуры изменить на PRO_URO(tt^.pll,kk+1); и PRO_URO(tt^.prr,kk+1); соответственно.
3) write('>>',kk); делать после проверки if (tt^.pll=nil) and (tt^.prr=nil), т.е только в той итерации которая не порождает новую (то бишь в тупиковой ветви)
eoln вне форума Ответить с цитированием
Старый 07.09.2012, 21:28   #8
Madmaxisss
Форумчанин
 
Регистрация: 12.07.2011
Сообщений: 158
По умолчанию

(сообщение eoln не заметил) а как тогда подсчитать уровни от узла(корня) tt в моем случае???

Последний раз редактировалось Madmaxisss; 07.09.2012 в 21:31.
Madmaxisss вне форума Ответить с цитированием
Старый 07.09.2012, 21:29   #9
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Без отладки трудно сказать (а код для построения дерева писать лень), но примерно такие изменения (ИМХО, конечно, могу ошибаться):
1) убрать inc(kk); - иначе в узлах где два листа дублироваться будет
2) вызов процедуры изменить на PRO_URO(tt^.pll,kk+1); и PRO_URO(tt^.prr,kk+1); соответственно.
3) write('>>',kk); делать после проверки if (tt^.pll=nil) and (tt^.prr=nil), т.е только в той итерации которая не порождает новую (то бишь в тупиковой ветви)
Смотря что он хочет посчитать. В предложенном вами варианте - будут считать только те узлы, у которых оба потомка пусты. При том варианте, как у него - считаются варианты, когда один из потомков пуст, то есть возможен "обратный" подстчет при откате, когда дерево постоено только в одну сторону - лево или право, и при возврате из рекурсии будут считаться "пустые НИЛЛЫ" - 4-3-2-1, до корня. Поэтому надо ему решить, что и как он считает.

Ваш вариант может быть более верный. Считать только самые крайние узлы.

Еще раз сформулируй конкретно задачу, что ты хочешь посчитать?

Дай точнее определение в твоем понятии - что такое уровень дерева. Условия его определения.
и это пройдет...

Последний раз редактировалось Stilet; 07.09.2012 в 21:54.
grenles вне форума Ответить с цитированием
Старый 07.09.2012, 21:48   #10
Madmaxisss
Форумчанин
 
Регистрация: 12.07.2011
Сообщений: 158
По умолчанию

Цитата:
Сообщение от grenles Посмотреть сообщение
Еще раз сформулируй конкретно задачу, что ты хочешь посчитать?

Дай точнее определение в твоем понятии - что такое уровень дерева. Условия его определения.
по идее я упростил задачу))) ну вообще задача стоит следующая: делается обход дерева и от узла(корня) tt до ветки нужно занести в дерево значения kk (красным цветом).
Изображения
Тип файла: jpg Безымянный.jpg (42.7 Кб, 41 просмотров)

Последний раз редактировалось Madmaxisss; 07.09.2012 в 21:55.
Madmaxisss вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Принцип загрузки игровых уровней murzilka6002 Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 27.04.2012 14:56
Расчет уровней в бинарном дереве holi10 Общие вопросы C/C++ 0 01.06.2011 18:22
Задать свойства уровней Polotenchik Microsoft Office Word 2 25.05.2010 14:44