Эта программа удаляет заданный узел. Но она не удаляет узел вместе с поддеревями , а только один. А мне нужно, чтобы удаляла вместе поддеревями . Т.е. чтобы и узел пропал, и все, что после него. Как это сделать. И можно ли что-то сделать прямо в этой программе, чтобы покороче.
Код
function FIND(Root:ref; kl3:integer; var T{указатель
на удаляемый элемент},Parent{его предок}:ref):boolean;
begin T:=Root; while T<> nil do
begin if kl3=T^.key then begin FIND:=true; exit end;
Parent:=T;{запомнить указатель перед спуском}
if kl3<T^.key then T:=T^.Left else T:=T^.Right; end;
FIND:=False; end;
procedure DEL (var Root:ref; kl3:integer); {без поддеревьев}
var T:ref; {удаляемый узел} Parent:ref; {предок удаляемого узла}
Q:ref; {узел,заменяющий удаляемый} fl:boolean;
function SPUSK (var T:ref):ref; {спуск по дереву}
var Q:ref;{узел,заменяющий удаляемый} prev:ref; {предок Q}
begin Q:=T^.Right;
if Q^.Left=nil then Q^.Left:=T^.Left {1} {см стр 148 Павловской}
else begin {2} repeat
prev:=Q; Q:=Q^.Left; until Q^.Left=nil; Q^.Left:=T^.Left; {3}
prev^.Left:=Q^.Right; {4} Q^.Right:=T^.Right; {5} end;
SPUSK:=Q; end;
begin {ищем ключ}
if not FIND (Root,kl3,T,Parent) then begin textcolor(15); gotoxy(25,7);
writeln('Такого элемента нет');
textcolor(8); gotoxy(20,11);
writeln('Нажмите любую клавишу для продолжения');
readkey; exit; end;
if T^.Left=nil then Q:=T^.Right {7} else
if T^.Right=nil then Q:=T^.Left {8} else Q:=SPUSK (T); {9}
if T=Root then Root :=Q {10} else {11}
if kl3 < parent^.key then parent^.Left:=Q else parent^.Right:=Q;
DISPOSE (T); {12} end;
на удаляемый элемент},Parent{его предок}:ref):boolean;
begin T:=Root; while T<> nil do
begin if kl3=T^.key then begin FIND:=true; exit end;
Parent:=T;{запомнить указатель перед спуском}
if kl3<T^.key then T:=T^.Left else T:=T^.Right; end;
FIND:=False; end;
procedure DEL (var Root:ref; kl3:integer); {без поддеревьев}
var T:ref; {удаляемый узел} Parent:ref; {предок удаляемого узла}
Q:ref; {узел,заменяющий удаляемый} fl:boolean;
function SPUSK (var T:ref):ref; {спуск по дереву}
var Q:ref;{узел,заменяющий удаляемый} prev:ref; {предок Q}
begin Q:=T^.Right;
if Q^.Left=nil then Q^.Left:=T^.Left {1} {см стр 148 Павловской}
else begin {2} repeat
prev:=Q; Q:=Q^.Left; until Q^.Left=nil; Q^.Left:=T^.Left; {3}
prev^.Left:=Q^.Right; {4} Q^.Right:=T^.Right; {5} end;
SPUSK:=Q; end;
begin {ищем ключ}
if not FIND (Root,kl3,T,Parent) then begin textcolor(15); gotoxy(25,7);
writeln('Такого элемента нет');
textcolor(8); gotoxy(20,11);
writeln('Нажмите любую клавишу для продолжения');
readkey; exit; end;
if T^.Left=nil then Q:=T^.Right {7} else
if T^.Right=nil then Q:=T^.Left {8} else Q:=SPUSK (T); {9}
if T=Root then Root :=Q {10} else {11}
if kl3 < parent^.key then parent^.Left:=Q else parent^.Right:=Q;
DISPOSE (T); {12} end;