Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Алгоритмы _ Как можно освободить место занимаемое деревом

Автор: Scorp_Freeman 16.12.2007 2:59

[b]Добавлено через 11 мин.
lol.gif ПРОСТИТЕ)) ПОКА РЕДАКТИРОВАЛ ТЕМУ ЗАМЕТИЛ СВОЮ ОШИБКУ lol.gif

ТЕПЕРЬ РАБОТАЕТ.
Может кому то пригодиться процедура deleteTree5 которая удаляет узел с ключем равным параметру fio.[/b]


Я создал дерево процедурами создание первого узла и добавления нового узла. Каждый узел может иметь максимум два поддерева. Процедуру удаления ветви одноя я нашел реализованную:

Код
type name=string[20];

     TNodeTree=^Node;
     Node=record
         FIO:name;
         Date:TDateTime;
         Status:name;
         Left,
         Right: TNodeTree;
     end;






Код
procedure deleteTree5( var q: TNodeTree;x:name);
var      p: TNodeTree;
  procedure del(var c: TNodeTree);
   begin
       if c^.right <> nil then del(c^.right)
       else    begin
        p^.FIO:=c^.FIO;
        p:=c;
c:=c^.left;
            end;
   end;
  begin    {delete}
   if  q = nil then {writeln(" sym is not in tree") }
   else if x < q^.fio  then deleteTree5( q^.left,x)
        else  if x > q^.fio then deleteTree5( q^.right,x)
              else  begin
                    p:=q;
                    if p^.right = nil then q:=p^.left
                    else if p^.left = nil then q:=p^.right
                          else del(p^.left);
                    dispose(p);
                    end
   end;



Она работает)

Я поместил ее в цыкл пока не удалены все узлы:

Код
while root<>nil do DeleteTree5(root, root.fio);

Но программа виснет если дерево содержит больше чем один узыл (