Создаю дерево(картинку прикрепил):
Код:
program BinTree;
uses Tree;
var
TheRoot, P: PNode;
N: Integer; // Узел который будем искать etc
begin
TheRoot := Init;
MakeRoot(TheRoot, 7);
{ Левое поддерево }
AppendLeft(TheRoot, 4);
AppendLeft(TheRoot^.Left, 2);
AppendRight(TheRoot^.Left, 3);
AppendRight(TheRoot^.Left^.Right, 1);
AppendLeft(TheRoot^.Left^.Right^.Right, 0);
{ Правое поддерево }
AppendRight(TheRoot, 9);
AppendLeft(TheRoot^.Right, 10);
AppendLeft(TheRoot^.Right^.Left, 11);
AppendRight(TheRoot^.Right, 12);
{ Обходы дерева }
Writeln('Прямой обход дерева');
PreOrder(TheRoot);
Writeln();
Writeln('Обратный обход дерева');
PostOrder(TheRoot);
Writeln();
Writeln('Концевой обход дерева');
ReverseOrder(TheRoot);
Writeln();
{ Удаление/Поиск значений }
Writeln('Введите искомый узел');
Readln(N);
P := Find(TheRoot, N);
if P = Nil then
Writeln('Узел не найден')
else
Writeln('Узел найден');
Writeln('Введите узел который нужно удалить');
Readln(N);
Remove(TheRoot, N);
{ Обходы дерева }
Writeln('Прямой обход дерева');
PreOrder(TheRoot);
Writeln();
Writeln('Обратный обход дерева');
PostOrder(TheRoot);
Writeln();
Writeln('Концевой обход дерева');
ReverseOrder(TheRoot);
Writeln();
{ Удаляем дерево }
DestroyTree(TheRoot);
readln;
end.
Сама процедура:
Код:
procedure DeleteNode(var Root: PNode; E: TInfo);
function DownNode(X: PNode): PNode;
begin
if X^.Left = Nil then
begin
Result := X;
Exit;
end;
Result := DownNode(X^.Left);
end;
procedure FinalDelete(var Root: Pnode; XNode: PNode);
var
Min: PNode;
begin
if (XNode^.Left = Nil) and (XNode^.Right = Nil) then
begin
if Root^.Left = XNode then
Root^.Left := Nil
else
Root^.Right := Nil;
Dispose(XNode);
end
else
if (XNode^.Left <> Nil) and (XNode^.Right <> Nil) then
begin
Min := DownNode(XNode^.Right);
if Root^.Left = XNode then
Root^.Left := Min
else
Root^.Right := Min;
Min^.Left := XNode^.Left;
Dispose(XNode);
end
else
begin
if XNode^.Left <> Nil then
begin
if Root^.Left = XNode then
Root^.Left := XNode^.Left^.Left
else
Root^.Right := XNode^.Left^.Left;
end;
Dispose(XNode);
end;
end;
begin
if Root = Nil then
Exit;
if Root^.Left <> Nil then
if Root^.Left^.Info <> E then
DeleteNode(Root^.Left, E)
else
FinalDelete(Root, Root^.Left);
if Root^.Right <> Nil then
if Root^.Right^.Info <> E then
DeleteNode(Root^.Right, E)
else
FinalDelete(Root, Root^.Right);
end;
Узел 4 к примеру удаляется без проблем, а если удалятьузел 3, то при повторном обходе вылетает ошибка в процедуре обхода.