Click here to Skip to main content
Licence 
First Posted 13 Dec 2005
Views 92,689
Bookmarked 35 times

AVL Binary Tree for C++

By | 4 Jan 2006 | Article
Using the HeightBalancedTree C++ template as an array or as a sorted sequence.

Introduction

Very often, I had 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

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_ts:

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 strings:

#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

About the Author

Dimiter Georgiev



Bulgaria Bulgaria

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralYou have my 5 PinmemberPablo Yabo4:41 14 Oct '10  
GeneralCouple of observations... Pinmemberyafan4:30 5 Jan '06  
GeneralRe: Couple of observations... PinmemberDimiter Georgiev5:42 5 Jan '06  
GeneralAnother Wish List Item Pinmemberscott03561:38 29 Dec '05  
GeneralAnother Wish List Item Pinmemberscott03568:46 20 Dec '05  
GeneralRe: Another Wish List Item PinmemberDimiter Georgiev1:35 21 Dec '05  
GeneralRe: Another Wish List Item PinmemberDimiter Georgiev1:36 21 Dec '05  
GeneralRe: Another Wish List Item PinmemberDimiter Georgiev11:41 21 Dec '05  
GeneralLatest Version PinmemberDimiter Georgiev4:25 15 Dec '05  
GeneralWish List... PinmemberJimD.99996:14 14 Dec '05  
GeneralRe: Wish List... PinmemberDimiter Georgiev6:20 14 Dec '05  
GeneralRe: Wish List... PinmemberDimiter Georgiev6:49 14 Dec '05  
GeneralRe: Wish List... PinmemberDimiter Georgiev6:54 14 Dec '05  
GeneralRe: Wish List... PinmemberJimD.99997:04 14 Dec '05  
GeneralRe: Wish List... PinmemberDimiter Georgiev7:29 14 Dec '05  
GeneralRe: Wish List... PinmemberDimiter Georgiev11:35 18 Dec '05  
GeneralLazy Delete Method PinmemberMichael Holm1:59 14 Dec '05  
GeneralRe: Lazy Delete Method PinmemberDimiter Georgiev3:01 14 Dec '05  
Questionwhat about STL's map/set ? PinmemberIftahh13:41 13 Dec '05  
AnswerRe: what about STL's map/set ? Pinmemberemilio_grv21:19 13 Dec '05  
GeneralRe: what about STL's map/set ? PinmemberGast1285:33 14 Dec '05  
GeneralRe: what about STL's map/set ? PinmemberJimD.99996:09 14 Dec '05  
GeneralRe: what about STL's map/set ? PinmemberGast1286:29 14 Dec '05  
GeneralRe: what about STL's map/set ? PinmemberJimD.99996:49 14 Dec '05  
GeneralRe: what about STL's map/set ? PinmemberGast1287:11 14 Dec '05  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120517.1 | Last Updated 4 Jan 2006
Article Copyright 2005 by Dimiter Georgiev
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid