Здравствуйте. Помогите, пожалуйста, решить проблему: при удалении листьев дерева и его повторном обходе 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;
beginif t=nilthen createnode(t,x)
elsewith t^ dobeginif key<x then add(right,x)
elseif key>x then add(left,x);end;
end;
procedure PrintDown(T: TTree);
beginif T=nilthen exit;
with T^ dobegin
write(key,' ');
writeln;
PrintDown(left);
PrintDown(right);
endend;
{процедура удаления листьев}procedure del1(var v:ttree);
var t:ttree;
inf: integer;
beginif v=nilthen exit;
del1(v^.left);
del1(v^.right);
if (v^.left=nil) and (v^.right=nil) then dispose(v);
end;
volvo
14.12.2006 16:08
Цитата
Пожскажите в чем ошибся
В процедуре удаления листа... Во-первых, после Dispose значение указателя не является нулевым, а является неопределенным, то есть, куда такой указатель тебя зашлет при вызове PrintDown - одному процессору известно... А во-вторых, запускать рекурсию нужно только тогда, когда не выполняется условие (left = nil) and (right = nil), а не ВСЕГДА... Вот так должно работать:
procedure del1(var v:ttree);
var t: ttree;
beginif v = nilthen exit;
if (v^.left=nil) and (v^.right=nil) thenbegin
dispose(v); v := nil;
endelsebegin
del1(v^.left);
del1(v^.right);
end;
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.