Помощь - Поиск - Пользователи - Календарь
Полная версия: Бинарные деревья(функция Dispose)
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
User88
Здравствуйте. Помогите, пожалуйста, решить проблему: при удалении листьев дерева и его повторном обходе Turbo Pascal вылетает(закрывается). Пожскажите в чем ошибся, описание алгоритмов формирования, вывода и остальное, кроме процедуры удаления листьев брал с FAQа сайта. Вот описание процедур(создания, печати и удаления "листвы"):


uses crt;
type
ttype=integer;
ttree=^tnode;
tnode=record
left: ttree;
right:ttree;
key:integer;
level: integer;
end;

procedure add(var t:ttree;x:ttype);
procedure createnode(var p:ttree;n:ttype);
begin
new(p);
p^.key:=n;
p^.left:=nil;
p^.right:=nil;
end;
begin
if t=nil then createnode(t,x)
else with t^ do begin
if key<x then add(right,x)
else if key>x then add(left,x);end;
end;

procedure PrintDown(T: TTree);
begin
if T=nil then exit;
with T^ do begin
write(key,' ');
writeln;
PrintDown(left);
PrintDown(right);
end
end;

{процедура удаления листьев}
procedure del1(var v:ttree);
var t:ttree;
inf: integer;
begin
if v=nil then exit;
del1(v^.left);
del1(v^.right);
if (v^.left=nil) and (v^.right=nil) then dispose(v);
end;
volvo
Цитата
Пожскажите в чем ошибся
В процедуре удаления листа... Во-первых, после Dispose значение указателя не является нулевым, а является неопределенным, то есть, куда такой указатель тебя зашлет при вызове PrintDown - одному процессору известно... А во-вторых, запускать рекурсию нужно только тогда, когда не выполняется условие (left = nil) and (right = nil), а не ВСЕГДА... Вот так должно работать:
procedure del1(var v:ttree);
var t: ttree;
begin
if v = nil then exit;

if (v^.left=nil) and (v^.right=nil) then begin
dispose(v); v := nil;
end
else begin
del1(v^.left);
del1(v^.right);
end;
end;

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.