-
Notifications
You must be signed in to change notification settings - Fork 9
TAvlTree
The TAvlTree structure is a balanced binary tree which stores a collection of nodes. Each node has a key and a value associated with it. The nodes are sorted within the tree based on the order of their keys. Modifications to the tree are constructed such that the tree remains balanced at all times (there are always roughly equal numbers of nodes on either side of the tree). Balanced binary trees have several uses. They can be used as a mapping (searching for a value based on its key), or as a set of keys which is always ordered.
uses
container.avltree, utils.functor;
type
generic TAvlTree<K, V, KeyBinaryCompareFunctor> = class
KeyBinaryCompareFunctor is based on utils.functor.TBinaryFunctor interface and used to compare two keys.
If macro {$USE_OPTIONAL}
is defined, then all methods return a TOptionalValue wrapper, otherwise V.
uses
utils.optional;
type
TOptionalValue = {$IFDEF FPC}specialize{$ENDIF} TOptional<V>;
For non-existent values, returns a empty TOptionalValue if defined or an EKeyNotExistsException is thrown.
type
{$IFNDEF USE_OPTIONAL}
EKeyNotExistsException = class(Exception);
{$ENDIF}
A new AVL tree can be created by call its constructor.
constructor Create;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
begin
tree := TIntStrAvlTree.Create;
FreeAndNil(tree);
end;
Insert a new key-value pair into an AVL tree.
procedure Insert (Key : K; Value : V);
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
begin
tree := TIntStrAvlTree.Create;
tree.Insert(1, 'one');
FreeAndNil(tree);
end;
Remove an entry from a tree, specifying the key of the node to remove. Return false if no node with the specified key was found in the tree, true if a node with the specified key was removed.
function Remove (Key : K) : Boolean;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
begin
tree := TIntStrAvlTree.Create;
tree.Remove(1);
FreeAndNil(tree);
end;
Search an AVL tree for a value corresponding to a particular key. This uses the tree as a mapping.
function Search (Key : K) : {$IFNDEF USE_OPTIONAL}V{$ELSE}TOptionalValue{$ENDIF};
If value not exists returns empty TOptionalValue or raise EKeyNotExistsException.
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
begin
tree := TIntStrAvlTree.Create;
tree.Search(1);
FreeAndNil(tree);
end;
Search an AVL tree for a value corresponding to a particular key. Return default value if key not exists.
function SearchDefault (Key : K; ADefault : V) : V;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
begin
tree := TIntStrAvlTree.Create;
writeln(tree.SearchDefault(1, 'none'));
FreeAndNil(tree);
end;
Retrieve the number of entries in the tree.
function NumEntries : Cardinal;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
begin
tree := TIntStrAvlTree.Create;
writeln(tree.NumEnries);
FreeAndNil(tree);
end;
Return true if container is empty.
function IsEmpty : Boolean;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
begin
tree := TIntStrAvlTree.Create;
if tree.IsEmpty then
;
FreeAndNil(tree);
end;
It is possible to iterate for TAvlTree values using in
operator. Each value would present as TAvlTree.TIterator object.
uses
container.avltree, utils.functor;
type
generic TAvlTree<K, V, KeyBinaryCompareFunctor> = class
type
TIterator = class({$IFDEF FPC}specialize{$ENDIF}
TBidirectionalIterator<TAvlKeyValuePair, TIterator>)
end;
TBidirectionalIterator is a abstract class which provide interface for iterable object that can moves to both sides.
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
pair : TIntStrAvlTree.TAvlKeyValuePair;
begin
tree := TIntStrAvlTree.Create;
for pair in tree do
;
FreeAndNil(tree);
end;
Retrive the iterator for first entry in a AVL tree.
function FirstEntry : TIterator
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
iterator : TIntStrAvlTree.TIterator;
begin
tree := TIntStrAvlTree.Create;
iterator := tree.FirstEntry;
FreeAndNil(tree);
end;
Return true if iterator has correct value.
function HasValue : Boolean;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
iterator : TIntStrAvlTree.TIterator;
begin
tree := TIntStrAvlTree.Create;
iterator := tree.FirstEntry;
while iterator.HasValue do
begin
iterator := iterator.Next;
end;
FreeAndNil(tree);
end;
Retrieve the iterator for previous entry in an array list.
function Prev : TIterator;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
iterator : TIntStrAvlTree.TIterator;
begin
tree := TIntStrAvlTree.Create;
iterator := tree.FirstEntry;
while iterator.HasValue do
begin
iterator := iterator.Next;
end;
iterator := iterator.Prev;
FreeAndNil(tree);
end;
Retrieve the iterator for next entry in an array list.
function Next : TIterator;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
iterator : TIntStrAvlTree.TIterator;
begin
tree := TIntStrAvlTree.Create;
iterator := tree.FirstEntry;
while iterator.HasValue do
begin
iterator := iterator.Next;
end;
FreeAndNil(tree);
end;
Return key value.
property Key : K;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
iterator : TIntStrAvlTree.TIterator;
begin
tree := TIntStrAvlTree.Create;
iterator := tree.FirstEntry;
while iterator.HasValue do
begin
writeln(iterator.Key);
iterator := iterator.Next;
end;
FreeAndNil(tree);
end;
Return value.
property Value : V;
uses
container.avltree, utils.functor;
type
TIntStrAvlTree = {$IFDEF FPC}type specialize{$ENDIF} TAVlTree<Integer, String, TCompareFunctorInteger>;
var
tree : TIntStrAvlTree;
iterator : TIntStrAvlTree.TIterator;
begin
tree := TIntStrAvlTree.Create;
iterator := tree.FirstEntry;
while iterator.HasValue do
begin
writeln(iterator.Value);
iterator := iterator.Next;
end;
FreeAndNil(tree);
end;