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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2011, 16:34   #1
Vate
Пользователь
 
Регистрация: 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;

В общем я как-то неправильно прикрутил рекурсию и теперь она зацикливается.
Что я делаю не так, программач?
Vate вне форума Ответить с цитированием
Старый 17.05.2011, 18:29   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

скинь еще описание своей структуры для полной картины, ибо в этой процедуре бред написан, если следовать общепринятым обозначениям.
mMAg вне форума Ответить с цитированием
Старый 18.05.2011, 13:21   #3
Vate
Пользователь
 
Регистрация: 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.
Vate вне форума Ответить с цитированием
Старый 18.05.2011, 14:59   #4
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Знаете, почему она может зацикливаться понятия не имею, это нужно в дебаге смотреть. Я бы предположил, что такая прога должна попросту вылетать. Вы пытаетесь зайти в левого и правого сына даже несмотря на то, что указатель на текущую вершину может быть равен NULL.
mMAg вне форума Ответить с цитированием
Старый 18.05.2011, 20:31   #5
Vate
Пользователь
 
Регистрация: 14.10.2010
Сообщений: 20
По умолчанию

И как тут это исправить?
Vate вне форума Ответить с цитированием
Старый 18.05.2011, 20:37   #6
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Vate Посмотреть сообщение
И как тут это исправить?
вы написали столько кода и не можете пропросту добавить лишнюю проверку на NULL?!
mMAg вне форума Ответить с цитированием
Старый 19.05.2011, 20:11   #7
Vate
Пользователь
 
Регистрация: 14.10.2010
Сообщений: 20
По умолчанию

Таки да, что есть то есть.
Vate вне форума Ответить с цитированием
Старый 19.05.2011, 21:11   #8
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Vate Посмотреть сообщение
Таки да, что есть то есть.
Да-да-да, иди это загоняй кому-то другому.
mMAg вне форума Ответить с цитированием
Старый 19.05.2011, 23:23   #9
Vate
Пользователь
 
Регистрация: 14.10.2010
Сообщений: 20
По умолчанию

Таки да, я хз как добавить лишнюю проверку.
Собсно текст всех остальных процедур был дан преподом.
Vate вне форума Ответить с цитированием
Старый 19.05.2011, 23:59   #10
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Вот собсно пусть препод вас и научит добавить лишнюю проверку.
mMAg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите, пожалуйста, написать программу в Паскаль по теме "Множества" 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