Курсовая работа: Ссылочные типы. Динамические переменные
else
IncludeInTree2( NewElem, SubTree^.Right )
end;
4.3 Удаление элемента дерева
Проблема реализации данной операции состоит в том, что в общем случае, в удаляемую вершину входит одна связь, а выходят две. Поэтому, необходимо найти подходящий элемент дерева, который можно было бы вставить на место удаляемого. Этот элемент является либо самым правым элементом левого поддерева (для достижения этого элемента необходимо перейти в следующую вершину по левой ветви, а затем, переходить в очередные вершины по правым ветвям до тех пор, пока очередная такая ссылка не будет равна nil), либо самый левый элемент правого поддерева (для достижения этого элемента необходимо перейти в следующую вершину по правой ветви, а затем, переходить в очередные вершины по левым ветвям до тех пор, пока очередная такая ссылка не будет равна nil). Процедура исключения элемента из двоичного дерева должна различать тои случая:
1. элемента с заданной информативной частью в дереве нет; 2. элемент с заданной информативной частью имеет не более одной ветви; 3. элемент с заданной информативной частью имеет две ветви.
procedure DeleteElemOfTree( var Tree: Assoc1; Elem: TypeOfElem1 );
var
ServiceVar1: Assoc1;
procedure Del( var ServiceVar2: Assoc1 );
begin
if ServiceVar2^.Right= nil then begin
ServiceVar1^.Elem:= ServiceVar2^.Elem;
ServiceVar1:= ServiceVar2;
ServiceVar2:=ServiceVar2^.Left
end
else Del( ServiceVar2^.Right )
end;
begin
{удаление элемента с информативным полем равным Elem из дерева Tree}
if Tree= nil then
{первый случай процедуры удаления}
writeln( 'Элемент не найден' )
else
{поиск элемента с заданным ключом}
if Elem < Tree^.Elem then DeleteElemOfTree( Tree^.Left, Elem )
else
if Elem > Tree^.Elem then
DeleteElemOfTree( Tree^.Right, Elem )