mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-11 15:00:38 +01:00
avglvltree: made Root read only
git-svn-id: trunk@36124 -
This commit is contained in:
parent
4d16618629
commit
58b480dc4c
@ -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;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user