avglvltree: replaced recursion with simple loop

git-svn-id: trunk@36134 -
This commit is contained in:
mattias 2012-03-17 19:12:19 +00:00
parent c41894692e
commit ef5ef38048

View File

@ -830,21 +830,19 @@ var
OldRightLeftLeft, OldRightLeftRight, OldLeftRightLeft, OldLeftRightRight
: TAvgLvlTreeNode;
begin
if (ANode=nil) then exit;
while ANode<>nil do begin
if ((ANode.Balance=+1) or (ANode.Balance=-1)) then exit;
OldParent:=ANode.Parent;
if (ANode.Balance=0) then begin
// Treeheight has decreased by one
if (OldParent<>nil) then begin
if (OldParent=nil) then
exit;
if(OldParent.Left=ANode) then
Inc(OldParent.Balance)
else
Dec(OldParent.Balance);
BalanceAfterDelete(OldParent);
end;
exit;
end;
if (ANode.Balance=+2) then begin
ANode:=OldParent;
end else if (ANode.Balance=+2) then begin
// Node is overweighted to the right
OldRight:=ANode.Right;
if (OldRight.Balance>=0) then begin
@ -866,7 +864,7 @@ begin
OldRightLeft.Parent:=ANode;
ANode.Balance:=(1-OldRight.Balance); // toggle 0 and 1
Dec(OldRight.Balance);
BalanceAfterDelete(OldRight);
ANode:=OldRight;
end else begin
// OldRight.Balance=-1
// double rotate right left
@ -900,7 +898,7 @@ begin
else
OldRight.Balance:=+1;
OldRightLeft.Balance:=0;
BalanceAfterDelete(OldRightLeft);
ANode:=OldRightLeft;
end;
end else begin
// Node.Balance=-2
@ -924,7 +922,7 @@ begin
OldLeftRight.Parent:=ANode;
ANode.Balance:=(-1-OldLeft.Balance); // toggle 0 and -1
Inc(OldLeft.Balance);
BalanceAfterDelete(OldLeft);
ANode:=OldLeft;
end else begin
// OldLeft.Balance = 1
// double rotate left right
@ -958,7 +956,8 @@ begin
else
OldLeft.Balance:=-1;
OldLeftRight.Balance:=0;
BalanceAfterDelete(OldLeftRight);
ANode:=OldLeftRight;
end;
end;
end;
end;