|
@@ -42,10 +42,17 @@ type
|
|
function TreeDepth: integer; // longest WAY down. e.g. only one node => 0 !
|
|
function TreeDepth: integer; // longest WAY down. e.g. only one node => 0 !
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ TBaseAVLTreeNodeManager = class
|
|
|
|
+ public
|
|
|
|
+ procedure DisposeNode(ANode: TAVLTreeNode); virtual; abstract;
|
|
|
|
+ function NewNode: TAVLTreeNode; virtual; abstract;
|
|
|
|
+ end;
|
|
|
|
+
|
|
TAVLTree = class
|
|
TAVLTree = class
|
|
private
|
|
private
|
|
FOnCompare: TListSortCompare;
|
|
FOnCompare: TListSortCompare;
|
|
FCount: integer;
|
|
FCount: integer;
|
|
|
|
+ nodemgr : TBaseAVLTreeNodeManager;
|
|
procedure BalanceAfterInsert(ANode: TAVLTreeNode);
|
|
procedure BalanceAfterInsert(ANode: TAVLTreeNode);
|
|
procedure BalanceAfterDelete(ANode: TAVLTreeNode);
|
|
procedure BalanceAfterDelete(ANode: TAVLTreeNode);
|
|
function FindInsertPos(Data: Pointer): TAVLTreeNode;
|
|
function FindInsertPos(Data: Pointer): TAVLTreeNode;
|
|
@@ -84,12 +91,13 @@ type
|
|
function ConsistencyCheck: integer;
|
|
function ConsistencyCheck: integer;
|
|
procedure WriteReportToStream(s: TStream; var StreamSize: int64);
|
|
procedure WriteReportToStream(s: TStream; var StreamSize: int64);
|
|
function ReportAsString: string;
|
|
function ReportAsString: string;
|
|
|
|
+ procedure SetNodeManager(newmgr:TBaseAVLTreeNodeManager);
|
|
constructor Create(OnCompareMethod: TListSortCompare);
|
|
constructor Create(OnCompareMethod: TListSortCompare);
|
|
constructor Create;
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
destructor Destroy; override;
|
|
end;
|
|
end;
|
|
|
|
|
|
- TAVLTreeNodeMemManager = class
|
|
|
|
|
|
+ TAVLTreeNodeMemManager = class(TBaseAVLTreeNodeManager)
|
|
private
|
|
private
|
|
FFirstFree: TAVLTreeNode;
|
|
FFirstFree: TAVLTreeNode;
|
|
FFreeCount: integer;
|
|
FFreeCount: integer;
|
|
@@ -100,8 +108,8 @@ type
|
|
procedure SetMinFree(NewValue: integer);
|
|
procedure SetMinFree(NewValue: integer);
|
|
procedure DisposeFirstFreeNode;
|
|
procedure DisposeFirstFreeNode;
|
|
public
|
|
public
|
|
- procedure DisposeNode(ANode: TAVLTreeNode);
|
|
|
|
- function NewNode: TAVLTreeNode;
|
|
|
|
|
|
+ procedure DisposeNode(ANode: TAVLTreeNode); override;
|
|
|
|
+ function NewNode: TAVLTreeNode; override;
|
|
property MinimumFreeNode: integer read FMinFree write SetMinFree;
|
|
property MinimumFreeNode: integer read FMinFree write SetMinFree;
|
|
property MaximumFreeNodeRatio: integer
|
|
property MaximumFreeNodeRatio: integer
|
|
read FMaxFreeRatio write SetMaxFreeRatio; // in one eighth steps
|
|
read FMaxFreeRatio write SetMaxFreeRatio; // in one eighth steps
|
|
@@ -129,7 +137,7 @@ end;
|
|
|
|
|
|
function TAVLTree.Add(Data: Pointer): TAVLTreeNode;
|
|
function TAVLTree.Add(Data: Pointer): TAVLTreeNode;
|
|
begin
|
|
begin
|
|
- Result:=NodeMemManager.NewNode;
|
|
|
|
|
|
+ Result:=NodeMgr.NewNode;
|
|
Result.Data:=Data;
|
|
Result.Data:=Data;
|
|
Add(Result);
|
|
Add(Result);
|
|
end;
|
|
end;
|
|
@@ -468,7 +476,7 @@ procedure TAVLTree.Clear;
|
|
if ANode.Left<>nil then DeleteNode(ANode.Left);
|
|
if ANode.Left<>nil then DeleteNode(ANode.Left);
|
|
if ANode.Right<>nil then DeleteNode(ANode.Right);
|
|
if ANode.Right<>nil then DeleteNode(ANode.Right);
|
|
end;
|
|
end;
|
|
- NodeMemManager.DisposeNode(ANode);
|
|
|
|
|
|
+ NodeMgr.DisposeNode(ANode);
|
|
end;
|
|
end;
|
|
|
|
|
|
// Clear
|
|
// Clear
|
|
@@ -481,6 +489,7 @@ end;
|
|
constructor TAVLTree.Create(OnCompareMethod: TListSortCompare);
|
|
constructor TAVLTree.Create(OnCompareMethod: TListSortCompare);
|
|
begin
|
|
begin
|
|
inherited Create;
|
|
inherited Create;
|
|
|
|
+ nodemgr:=NodeMemManager;
|
|
FOnCompare:=OnCompareMethod;
|
|
FOnCompare:=OnCompareMethod;
|
|
FCount:=0;
|
|
FCount:=0;
|
|
end;
|
|
end;
|
|
@@ -518,7 +527,7 @@ begin
|
|
Root:=nil;
|
|
Root:=nil;
|
|
end;
|
|
end;
|
|
dec(FCount);
|
|
dec(FCount);
|
|
- NodeMemManager.DisposeNode(ANode);
|
|
|
|
|
|
+ NodeMgr.DisposeNode(ANode);
|
|
exit;
|
|
exit;
|
|
end;
|
|
end;
|
|
if (ANode.Right=nil) then begin
|
|
if (ANode.Right=nil) then begin
|
|
@@ -541,7 +550,7 @@ begin
|
|
Root:=OldLeft;
|
|
Root:=OldLeft;
|
|
end;
|
|
end;
|
|
dec(FCount);
|
|
dec(FCount);
|
|
- NodeMemManager.DisposeNode(ANode);
|
|
|
|
|
|
+ NodeMgr.DisposeNode(ANode);
|
|
exit;
|
|
exit;
|
|
end;
|
|
end;
|
|
if (ANode.Left=nil) then begin
|
|
if (ANode.Left=nil) then begin
|
|
@@ -564,7 +573,7 @@ begin
|
|
Root:=OldRight;
|
|
Root:=OldRight;
|
|
end;
|
|
end;
|
|
dec(FCount);
|
|
dec(FCount);
|
|
- NodeMemManager.DisposeNode(ANode);
|
|
|
|
|
|
+ NodeMgr.DisposeNode(ANode);
|
|
exit;
|
|
exit;
|
|
end;
|
|
end;
|
|
// DelNode has both: Left and Right
|
|
// DelNode has both: Left and Right
|
|
@@ -1028,6 +1037,11 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure TAVLTree.SetNodeManager(newmgr:TBaseAVLTreeNodeManager);
|
|
|
|
+// only allowed just after create.
|
|
|
|
+begin
|
|
|
|
+ nodemgr:=newmgr;
|
|
|
|
+end;
|
|
|
|
|
|
{ TAVLTreeNode }
|
|
{ TAVLTreeNode }
|
|
|
|
|
|
@@ -1058,6 +1072,8 @@ begin
|
|
Data:=nil;
|
|
Data:=nil;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
{ TAVLTreeNodeMemManager }
|
|
{ TAVLTreeNodeMemManager }
|
|
|
|
|
|
constructor TAVLTreeNodeMemManager.Create;
|
|
constructor TAVLTreeNodeMemManager.Create;
|
|
@@ -1150,12 +1166,9 @@ end;
|
|
|
|
|
|
|
|
|
|
initialization
|
|
initialization
|
|
-
|
|
|
|
-NodeMemManager:=TAVLTreeNodeMemManager.Create;
|
|
|
|
|
|
+ NodeMemManager:=TAVLTreeNodeMemManager.Create;
|
|
|
|
|
|
finalization
|
|
finalization
|
|
-
|
|
|
|
-NodeMemManager.Free;
|
|
|
|
-NodeMemManager:=nil;
|
|
|
|
-
|
|
|
|
|
|
+ NodeMemManager.Free;
|
|
|
|
+ NodeMemManager:=nil;
|
|
end.
|
|
end.
|