Есть задача. Имеется бинарное дерево. Информация в узлах не важна (могут быть цифры, могут быть буквы).
Задание: Удалить все листья дерева.
Допустим делаем обход
Procedure obhod(p:tree);
Begin
if p<>nil then
begin
obhod(p^.left);
writeln(p^.inf);
obhod(p^.right);
end;
end;
Procedure DelTree(var p:tree);
Begin
if p<>nil then begin
DelTree(p^.Left);
DelTree(p^.Right);
Dispose(p);
p := nil;
end;
end;
Это удаляет полностью дерево, по поводу пробелов не догнал?
function del_leaves(var p: ttree): boolean;Причин не работать не вижу, дерево создавать лениво, поэтому не проверял. Компиляцию вроде проходит.
var
Lt, Rg: boolean;
begin
del_leaves := false;
if p = nil then exit;
del_leaves := true;
Rg := del_leaves(p^.right);
Lt := del_leaves(p^.left);
// только не надо умничать и вносить все вычисления вот в этот if,
// и избавляться от переменных Lt и Rg...
// Если я этого не сделал - значит, для этого были причины.
if not(Lt or Rg) then
begin
dispose(p);
p := nil;
end;
end;
volvo, попробовал вроде все норм работает, но все равно еще сам попробую, а то как то нет желания чужое брать. На крайний случай если все же у самого не выйдет. А тебе очередное СПАСИБО!
volvo единственное баг, если дерево состоит из одного корня, то оно удаляется. Пока выявил только это).
Подправил этот баг вызовом функции из главной программы вот с таким условием:
if not (( t^.llink=nil) and (t^.rlink=nil)) then dellist(t);
volvo, ок. Значит не баг, но для себя подправил, чтоб если что препод не придирался)))
я бы на месте препода наоборот придралась к "исправленному" поведению
мисс_граффити, посмотрим, придерется исправим обратно и все, деловто. По сути volvo прав на все 100%.
Всю ночь просидел но так своего алгоритма не придумал, видимо мозгов не хватает))))
Еще раз спасибо volvo.