Introduction
Very often, I wanted a container that provides fast insertion and fast indexing. I also often had the need for sorted containers. Here, I present an AVL binary tree implementation that serves all these needs.
Background
- Here is some information on AVL binary trees: AVL Trees
- Here is another CodeProject entry on AVL binary trees (I haven't used this implementation):
- Here is a CodeProject entry discussing Chen Venkataraman's
HighResElapsedTimer
that I use in the example program:
Using the Code
You can use the HeightBalancedTree<>
template as either a sequence container that supports fast arbitrary insertions and deletions of objects, or as a sorted container.
If you use the tree as a fast sequence container, use the methods InsertByIndex
, FindByIndex
, and RemoveByIndex
.
If you use the tree as a sorted container, use the methods InsertComparable
, FindComparable
, and RemoveComparable
. These methods use the user-provided Comparator
type to compare the objects stored inside the container.
You can always use the overloaded operator[]
that works just like FindByIndex
. It throws a std::out_of_range
exception if the index is invalid.
All by-index modification and access methods of the container take approximately O(log(n)) time.
All by-comparison modification and access methods of the container take approximately O(k * log(n)) time, where k is the time taken to compare any two objects.
Here's some sample code that creates and modifies a random-access array of size_t
s:
typedef HeightBalancedTree<size_t> SizeTTree;
SizeTTree tree;
for (size_t i = 0; i < n; ++i)
{
tree.InsertByIndex(indices[i], data[i]);
}
for (size_t i = 0; i < n; ++i)
{
tree.RemoveByIndex(0);
}
Here's some sample code that creates and modifies a sorted sequence of string
s:
#ifdef UNICODE
std::wostream & tcout = wcout;
typedef HeightBalancedTree<
std::basic_string<wchar_t>,
StringComparator<
std::basic_string<wchar_t>
>
> TStringTree;
#else
std::ostream & tcout = cout;
typedef HeightBalancedTree<
std::string,
StringComparator<std::string>
> TStringTree;
#endif
TStringTree tree;
tree.InsertComparable(TEXT("ABE"));
tree.InsertComparable(TEXT("aBdE"));
tree.InsertComparable(TEXT("AbCd"));
tree.InsertComparable(TEXT("aBc"));
tree.InsertComparable(TEXT("AbD"));
tree.InsertComparable(TEXT("aBe"));
for (size_t i = 0; i < tree.Size(); ++i)
{
tcout << "tree[" << i << "] =
" << tree[i] << endl;
}
Points of Interest
Tell me what you think of this. I'm open to suggestions.
History
- 2005, December, 14 - 1.0.1 Fixed a bug in
FindComparable
: the returned index was wrong - 2005, December, 13 - Initial version uploaded to CodeProject
License
This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.
A list of licenses authors might use can be found here.