mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 10:19:12 +02:00
avglvltree: simplified delete
git-svn-id: trunk@36140 -
This commit is contained in:
parent
23abaf2eae
commit
5102efbb95
@ -1083,79 +1083,13 @@ var
|
|||||||
OldParent, OldLeft, OldRight, Successor, OldSuccParent, OldSuccLeft,
|
OldParent, OldLeft, OldRight, Successor, OldSuccParent, OldSuccLeft,
|
||||||
OldSuccRight: TAvgLvlTreeNode;
|
OldSuccRight: TAvgLvlTreeNode;
|
||||||
OldBalance: integer;
|
OldBalance: integer;
|
||||||
|
Child: TAvgLvlTreeNode;
|
||||||
begin
|
begin
|
||||||
OldParent:=ANode.Parent;
|
OldParent:=ANode.Parent;
|
||||||
OldBalance:=ANode.Balance;
|
OldBalance:=ANode.Balance;
|
||||||
ANode.Parent:=nil;
|
ANode.Parent:=nil;
|
||||||
ANode.Balance:=0;
|
ANode.Balance:=0;
|
||||||
if ((ANode.Left=nil) and (ANode.Right=nil)) then begin
|
if (ANode.Left<>nil) and (ANode.Right<>nil) then begin
|
||||||
// Node is Leaf (no children)
|
|
||||||
if (OldParent<>nil) then begin
|
|
||||||
// Node has parent
|
|
||||||
if (OldParent.Left=ANode) then begin
|
|
||||||
// Node is left child of OldParent
|
|
||||||
OldParent.Left:=nil;
|
|
||||||
Inc(OldParent.Balance);
|
|
||||||
end else begin
|
|
||||||
// Node is right child of OldParent
|
|
||||||
OldParent.Right:=nil;
|
|
||||||
Dec(OldParent.Balance);
|
|
||||||
end;
|
|
||||||
BalanceAfterDelete(OldParent);
|
|
||||||
end else begin
|
|
||||||
// Node is the only node of tree
|
|
||||||
fRoot:=nil;
|
|
||||||
end;
|
|
||||||
dec(FCount);
|
|
||||||
ANode.Free;
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
if (ANode.Right=nil) then begin
|
|
||||||
// Left is only child
|
|
||||||
// and because DelNode is AVL, Right has no childrens
|
|
||||||
// replace DelNode with Left
|
|
||||||
OldLeft:=ANode.Left;
|
|
||||||
ANode.Left:=nil;
|
|
||||||
OldLeft.Parent:=OldParent;
|
|
||||||
if (OldParent<>nil) then begin
|
|
||||||
if (OldParent.Left=ANode) then begin
|
|
||||||
OldParent.Left:=OldLeft;
|
|
||||||
Inc(OldParent.Balance);
|
|
||||||
end else begin
|
|
||||||
OldParent.Right:=OldLeft;
|
|
||||||
Dec(OldParent.Balance);
|
|
||||||
end;
|
|
||||||
BalanceAfterDelete(OldParent);
|
|
||||||
end else begin
|
|
||||||
fRoot:=OldLeft;
|
|
||||||
end;
|
|
||||||
dec(FCount);
|
|
||||||
ANode.Free;
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
if (ANode.Left=nil) then begin
|
|
||||||
// Right is only child
|
|
||||||
// and because DelNode is AVL, Left has no childrens
|
|
||||||
// replace DelNode with Right
|
|
||||||
OldRight:=ANode.Right;
|
|
||||||
ANode.Right:=nil;
|
|
||||||
OldRight.Parent:=OldParent;
|
|
||||||
if (OldParent<>nil) then begin
|
|
||||||
if (OldParent.Left=ANode) then begin
|
|
||||||
OldParent.Left:=OldRight;
|
|
||||||
Inc(OldParent.Balance);
|
|
||||||
end else begin
|
|
||||||
OldParent.Right:=OldRight;
|
|
||||||
Dec(OldParent.Balance);
|
|
||||||
end;
|
|
||||||
BalanceAfterDelete(OldParent);
|
|
||||||
end else begin
|
|
||||||
fRoot:=OldRight;
|
|
||||||
end;
|
|
||||||
dec(FCount);
|
|
||||||
ANode.Free;
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
// DelNode has both: Left and Right
|
// DelNode has both: Left and Right
|
||||||
// Replace ANode with symmetric Successor
|
// Replace ANode with symmetric Successor
|
||||||
Successor:=ANode.FindSuccessor;
|
Successor:=ANode.FindSuccessor;
|
||||||
@ -1199,6 +1133,33 @@ begin
|
|||||||
fRoot:=Successor;
|
fRoot:=Successor;
|
||||||
// delete Node as usual
|
// delete Node as usual
|
||||||
Delete(ANode);
|
Delete(ANode);
|
||||||
|
end else begin
|
||||||
|
// left or right is nil
|
||||||
|
if ANode.Left<>nil then
|
||||||
|
Child:=ANode.Left
|
||||||
|
else
|
||||||
|
Child:=ANode.Right;
|
||||||
|
if Child<>nil then
|
||||||
|
Child.Parent:=OldParent;
|
||||||
|
if (OldParent<>nil) then begin
|
||||||
|
// Node has parent
|
||||||
|
if (OldParent.Left=ANode) then begin
|
||||||
|
// Node is left child of OldParent
|
||||||
|
OldParent.Left:=Child;
|
||||||
|
Inc(OldParent.Balance);
|
||||||
|
end else begin
|
||||||
|
// Node is right child of OldParent
|
||||||
|
OldParent.Right:=Child;
|
||||||
|
Dec(OldParent.Balance);
|
||||||
|
end;
|
||||||
|
BalanceAfterDelete(OldParent);
|
||||||
|
end else begin
|
||||||
|
// Node is the only node of tree
|
||||||
|
fRoot:=Child;
|
||||||
|
end;
|
||||||
|
dec(FCount);
|
||||||
|
ANode.Free;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TAvgLvlTree.Remove(Data: Pointer);
|
procedure TAvgLvlTree.Remove(Data: Pointer);
|
||||||
|
Loading…
Reference in New Issue
Block a user