![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 14.10.2010
Сообщений: 20
|
![]()
Доброго времени суток, программерс клаб. Пишет вам студент-персокурсник.
Как и у всякого студента, в этом и следующем месяцах у меня встает жизненно важная проблема, а если конкретней: надвигающаяся сессия. Пока что ненавистная экзаменационная сессия лишь угрожающе гремит зачетами, но приход ее таки неизбежен. И вот как раз для зачета мне не хватает решения пары задачек, первую из которых я сейчас пытаюсь решить. Собсно, у задачки суть такова: Задача по теме "Бинарные деревья". Написать процедуру, вычисляющую разность между количествами вершин, имеющих только левых потомков и вершин, имеющих только правых потомков. С построением дерева проблем нет, в отличии от самой процедуры. Что я имею: procedure CI(root:refnode); var res,l,r:integer; begin if root<>nil then if (root^.right=nil) and (root^.left<>nil) then l:=l+1 else if (root^.left=nil) and (root^.right<>nil) then r:=r+1; res:=l-r; writeln(res); ci(root^.left); ci(root^.right); end; В общем я как-то неправильно прикрутил рекурсию и теперь она зацикливается. Что я делаю не так, программач? |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 11.08.2009
Сообщений: 433
|
![]()
скинь еще описание своей структуры для полной картины, ибо в этой процедуре бред написан, если следовать общепринятым обозначениям.
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 14.10.2010
Сообщений: 20
|
![]()
l и r показывают количества вершин, имеющих только левого, и только правого потомка соответственно. В res отправляется разность между этими величинами.
Ах да, полный текст программы ниже: type refnode=^node; node=record inf:integer; left,right:refnode; end; var root:refnode; i,n,t,l,r:integer; procedure include(var root:refnode; x:integer); begin if root=nil then begin new(root); with root^ do begin left:=nil; right:=nil; inf:=x; end; end else with root^ do if x<inf then include(left,x) else if x>inf then include(right,x); end; procedure CI(root:refnode); var res:integer; begin if root=nil then res:=0 else if (root^.right=nil) and (root^.left<>nil) then l:=l+1 else if (root^.left=nil) and (root^.right<>nil) then r:=r+1; res:=l-r; writeln(res); ci(root^.left); ci(root^.right); end; Begin writeln('Vvedite kol-vo vershin dereva'); readln(n); for i:=1 to n do begin writeln('Vvedite znachenie vershini ',i,':'); readln(t); include(root,t); end; writeln; browser1(root); writeln; writeln(counter(root)); ci(root); end. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 11.08.2009
Сообщений: 433
|
![]()
Знаете, почему она может зацикливаться понятия не имею, это нужно в дебаге смотреть. Я бы предположил, что такая прога должна попросту вылетать. Вы пытаетесь зайти в левого и правого сына даже несмотря на то, что указатель на текущую вершину может быть равен NULL.
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 14.10.2010
Сообщений: 20
|
![]()
И как тут это исправить?
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 11.08.2009
Сообщений: 433
|
![]() |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 14.10.2010
Сообщений: 20
|
![]()
Таки да, что есть то есть.
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 11.08.2009
Сообщений: 433
|
![]() |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 14.10.2010
Сообщений: 20
|
![]()
Таки да, я хз как добавить лишнюю проверку.
Собсно текст всех остальных процедур был дан преподом. |
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 11.08.2009
Сообщений: 433
|
![]()
Вот собсно пусть препод вас и научит добавить лишнюю проверку.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите, пожалуйста, написать программу в Паскаль по теме "Множества" | SArtem | Помощь студентам | 10 | 19.12.2009 11:40 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |
Задача по теме "файлы" | Aleo13 | Паскаль, Turbo Pascal, PascalABC.NET | 13 | 10.11.2008 21:30 |