avglvltree: made Root read only

git-svn-id: trunk@36124 -
This commit is contained in:
mattias 2012-03-17 16:57:40 +00:00
parent 4d16618629
commit 58b480dc4c

View File

@ -66,7 +66,8 @@ type
{ TAvgLvlTree } { TAvgLvlTree }
TAvgLvlTree = class TAvgLvlTree = class
private protected
fRoot: TAvgLvlTreeNode;
FCount: integer; FCount: integer;
FNodeMemManager: TAvgLvlTreeNodeMemManager; FNodeMemManager: TAvgLvlTreeNodeMemManager;
FOnCompare: TListSortCompare; FOnCompare: TListSortCompare;
@ -79,7 +80,7 @@ type
procedure SetCompares(const NewCompare: TListSortCompare; procedure SetCompares(const NewCompare: TListSortCompare;
const NewObjectCompare: TObjectSortCompare); const NewObjectCompare: TObjectSortCompare);
public public
Root: TAvgLvlTreeNode; property Root: TAvgLvlTreeNode read fRoot;
function Compare(Data1, Data2: Pointer): integer; function Compare(Data1, Data2: Pointer): integer;
function Find(Data: Pointer): TAvgLvlTreeNode; function Find(Data: Pointer): TAvgLvlTreeNode;
function FindKey(Key: Pointer; function FindKey(Key: Pointer;
@ -772,7 +773,7 @@ begin
ANode.Left:=nil; ANode.Left:=nil;
ANode.Right:=nil; ANode.Right:=nil;
inc(FCount); inc(FCount);
if Root<>nil then begin if fRoot<>nil then begin
InsertPos:=FindInsertPos(ANode.Data); InsertPos:=FindInsertPos(ANode.Data);
InsertComp:=Compare(ANode.Data,InsertPos.Data); InsertComp:=Compare(ANode.Data,InsertPos.Data);
ANode.Parent:=InsertPos; ANode.Parent:=InsertPos;
@ -785,21 +786,21 @@ begin
end; end;
BalanceAfterInsert(ANode); BalanceAfterInsert(ANode);
end else begin end else begin
Root:=ANode; fRoot:=ANode;
ANode.Parent:=nil; ANode.Parent:=nil;
end; end;
end; end;
function TAvgLvlTree.FindLowest: TAvgLvlTreeNode; function TAvgLvlTree.FindLowest: TAvgLvlTreeNode;
begin begin
Result:=Root; Result:=fRoot;
if Result<>nil then if Result<>nil then
while Result.Left<>nil do Result:=Result.Left; while Result.Left<>nil do Result:=Result.Left;
end; end;
function TAvgLvlTree.FindHighest: TAvgLvlTreeNode; function TAvgLvlTree.FindHighest: TAvgLvlTreeNode;
begin begin
Result:=Root; Result:=fRoot;
if Result<>nil then if Result<>nil then
while Result.Right<>nil do Result:=Result.Right; while Result.Right<>nil do Result:=Result.Right;
end; end;
@ -836,7 +837,7 @@ begin
else else
OldParent.Right:=OldRight; OldParent.Right:=OldRight;
end else end else
Root:=OldRight; fRoot:=OldRight;
ANode.Parent:=OldRight; ANode.Parent:=OldRight;
ANode.Right:=OldRightLeft; ANode.Right:=OldRightLeft;
OldRight.Parent:=OldParent; OldRight.Parent:=OldParent;
@ -858,7 +859,7 @@ begin
else else
OldParent.Right:=OldRightLeft; OldParent.Right:=OldRightLeft;
end else end else
Root:=OldRightLeft; fRoot:=OldRightLeft;
ANode.Parent:=OldRightLeft; ANode.Parent:=OldRightLeft;
ANode.Right:=OldRightLeftLeft; ANode.Right:=OldRightLeftLeft;
OldRight.Parent:=OldRightLeft; OldRight.Parent:=OldRightLeft;
@ -894,7 +895,7 @@ begin
else else
OldParent.Right:=OldLeft; OldParent.Right:=OldLeft;
end else end else
Root:=OldLeft; fRoot:=OldLeft;
ANode.Parent:=OldLeft; ANode.Parent:=OldLeft;
ANode.Left:=OldLeftRight; ANode.Left:=OldLeftRight;
OldLeft.Parent:=OldParent; OldLeft.Parent:=OldParent;
@ -916,7 +917,7 @@ begin
else else
OldParent.Right:=OldLeftRight; OldParent.Right:=OldLeftRight;
end else end else
Root:=OldLeftRight; fRoot:=OldLeftRight;
ANode.Parent:=OldLeftRight; ANode.Parent:=OldLeftRight;
ANode.Left:=OldLeftRightRight; ANode.Left:=OldLeftRightRight;
OldLeft.Parent:=OldLeftRight; OldLeft.Parent:=OldLeftRight;
@ -968,8 +969,8 @@ begin
else else
OldParentParent.Right:=ANode; OldParentParent.Right:=ANode;
end else begin end else begin
// OldParent was root node. New root node // OldParent was fRoot node. New fRoot node
Root:=ANode; fRoot:=ANode;
end; end;
ANode.Parent:=OldParentParent; ANode.Parent:=OldParentParent;
ANode.Right:=OldParent; ANode.Right:=OldParent;
@ -993,8 +994,8 @@ begin
else else
OldParentParent.Right:=OldRight; OldParentParent.Right:=OldRight;
end else begin end else begin
// OldParent was root node. new root node // OldParent was fRoot node. new fRoot node
Root:=OldRight; fRoot:=OldRight;
end; end;
OldRight.Parent:=OldParentParent; OldRight.Parent:=OldParentParent;
OldRight.Left:=ANode; OldRight.Left:=ANode;
@ -1037,8 +1038,8 @@ begin
else else
OldParentParent.Right:=ANode; OldParentParent.Right:=ANode;
end else begin end else begin
// OldParent was root node . new root node // OldParent was fRoot node . new fRoot node
Root:=ANode; fRoot:=ANode;
end; end;
ANode.Parent:=OldParentParent; ANode.Parent:=OldParentParent;
ANode.Left:=OldParent; ANode.Left:=OldParent;
@ -1062,8 +1063,8 @@ begin
else else
OldParentParent.Right:=OldLeft; OldParentParent.Right:=OldLeft;
end else begin end else begin
// OldParent was root node . new root node // OldParent was fRoot node . new fRoot node
Root:=OldLeft; fRoot:=OldLeft;
end; end;
OldLeft.Parent:=OldParentParent; OldLeft.Parent:=OldParentParent;
OldLeft.Left:=OldParent; OldLeft.Left:=OldParent;
@ -1105,8 +1106,8 @@ procedure TAvgLvlTree.Clear;
// Clear // Clear
begin begin
DeleteNode(Root); DeleteNode(fRoot);
Root:=nil; fRoot:=nil;
FCount:=0; FCount:=0;
end; end;
@ -1153,7 +1154,7 @@ begin
BalanceAfterDelete(OldParent); BalanceAfterDelete(OldParent);
end else begin end else begin
// Node is the only node of tree // Node is the only node of tree
Root:=nil; fRoot:=nil;
end; end;
dec(FCount); dec(FCount);
if NodeMemManager<>nil then if NodeMemManager<>nil then
@ -1179,7 +1180,7 @@ begin
end; end;
BalanceAfterDelete(OldParent); BalanceAfterDelete(OldParent);
end else begin end else begin
Root:=OldLeft; fRoot:=OldLeft;
end; end;
dec(FCount); dec(FCount);
if NodeMemManager<>nil then if NodeMemManager<>nil then
@ -1205,7 +1206,7 @@ begin
end; end;
BalanceAfterDelete(OldParent); BalanceAfterDelete(OldParent);
end else begin end else begin
Root:=OldRight; fRoot:=OldRight;
end; end;
dec(FCount); dec(FCount);
if NodeMemManager<>nil then if NodeMemManager<>nil then
@ -1254,7 +1255,7 @@ begin
else else
OldParent.Right:=Successor; OldParent.Right:=Successor;
end else end else
Root:=Successor; fRoot:=Successor;
// delete Node as usual // delete Node as usual
Delete(ANode); Delete(ANode);
end; end;
@ -1290,7 +1291,7 @@ end;
function TAvgLvlTree.Find(Data: Pointer): TAvgLvlTreeNode; function TAvgLvlTree.Find(Data: Pointer): TAvgLvlTreeNode;
var Comp: integer; var Comp: integer;
begin begin
Result:=Root; Result:=fRoot;
while (Result<>nil) do begin while (Result<>nil) do begin
Comp:=Compare(Data,Result.Data); Comp:=Compare(Data,Result.Data);
if Comp=0 then exit; if Comp=0 then exit;
@ -1306,7 +1307,7 @@ function TAvgLvlTree.FindKey(Key: Pointer;
OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode; OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
var Comp: integer; var Comp: integer;
begin begin
Result:=Root; Result:=fRoot;
while (Result<>nil) do begin while (Result<>nil) do begin
Comp:=OnCompareKeyWithData(Key,Result.Data); Comp:=OnCompareKeyWithData(Key,Result.Data);
if Comp=0 then exit; if Comp=0 then exit;
@ -1322,7 +1323,7 @@ function TAvgLvlTree.FindNearestKey(Key: Pointer;
OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode; OnCompareKeyWithData: TListSortCompare): TAvgLvlTreeNode;
var Comp: integer; var Comp: integer;
begin begin
Result:=Root; Result:=fRoot;
while (Result<>nil) do begin while (Result<>nil) do begin
Comp:=OnCompareKeyWithData(Key,Result.Data); Comp:=OnCompareKeyWithData(Key,Result.Data);
if Comp=0 then exit; if Comp=0 then exit;
@ -1391,7 +1392,7 @@ end;
function TAvgLvlTree.FindNearest(Data: Pointer): TAvgLvlTreeNode; function TAvgLvlTree.FindNearest(Data: Pointer): TAvgLvlTreeNode;
var Comp: integer; var Comp: integer;
begin begin
Result:=Root; Result:=fRoot;
while (Result<>nil) do begin while (Result<>nil) do begin
Comp:=Compare(Data,Result.Data); Comp:=Compare(Data,Result.Data);
if Comp=0 then exit; if Comp=0 then exit;
@ -1448,7 +1449,7 @@ end;
function TAvgLvlTree.FindInsertPos(Data: Pointer): TAvgLvlTreeNode; function TAvgLvlTree.FindInsertPos(Data: Pointer): TAvgLvlTreeNode;
var Comp: integer; var Comp: integer;
begin begin
Result:=Root; Result:=fRoot;
while (Result<>nil) do begin while (Result<>nil) do begin
Comp:=Compare(Data,Result.Data); Comp:=Compare(Data,Result.Data);
if Comp<0 then begin if Comp<0 then begin
@ -1579,7 +1580,7 @@ var RealCount: integer;
// TAvgLvlTree.ConsistencyCheck // TAvgLvlTree.ConsistencyCheck
begin begin
RealCount:=0; RealCount:=0;
Result:=CheckNode(Root); Result:=CheckNode(fRoot);
if Result<>0 then exit; if Result<>0 then exit;
if FCount<>RealCount then begin if FCount<>RealCount then begin
Result:=-1; Result:=-1;
@ -1601,7 +1602,7 @@ procedure TAvgLvlTree.FreeAndClear;
// TAvgLvlTree.FreeAndClear // TAvgLvlTree.FreeAndClear
begin begin
// free all data // free all data
FreeNode(Root); FreeNode(fRoot);
// free all nodes // free all nodes
Clear; Clear;
end; end;
@ -1666,7 +1667,7 @@ procedure TAvgLvlTree.WriteReportToStream(s: TStream);
// TAvgLvlTree.WriteReportToStream // TAvgLvlTree.WriteReportToStream
begin begin
WriteStr('-Start-of-AVL-Tree-------------------'+LineEnding); WriteStr('-Start-of-AVL-Tree-------------------'+LineEnding);
WriteTreeNode(Root); WriteTreeNode(fRoot);
WriteStr('-End-Of-AVL-Tree---------------------'+LineEnding); WriteStr('-End-Of-AVL-Tree---------------------'+LineEnding);
end; end;