CppCommon
1.0.4.1
C++ Common Library
|
Intrusive balanced AVL binary tree container. More...
#include <bintree_avl.h>
Classes | |
struct | Node |
AVL binary tree node. More... | |
Public Types | |
typedef T | value_type |
typedef TCompare | value_compare |
typedef value_type & | reference |
typedef const value_type & | const_reference |
typedef value_type * | pointer |
typedef const value_type * | const_pointer |
typedef ptrdiff_t | difference_type |
typedef size_t | size_type |
typedef BinTreeIterator< BinTreeAVL< T, TCompare >, T > | iterator |
typedef BinTreeConstIterator< BinTreeAVL< T, TCompare >, T > | const_iterator |
typedef BinTreeReverseIterator< BinTreeAVL< T, TCompare >, T > | reverse_iterator |
typedef BinTreeConstReverseIterator< BinTreeAVL< T, TCompare >, T > | const_reverse_iterator |
Public Member Functions | |
BinTreeAVL (const TCompare &compare=TCompare()) noexcept | |
template<class InputIterator > | |
BinTreeAVL (InputIterator first, InputIterator last, const TCompare &compare=TCompare()) noexcept | |
BinTreeAVL (const BinTreeAVL &) noexcept=default | |
BinTreeAVL (BinTreeAVL &&) noexcept=default | |
~BinTreeAVL () noexcept=default | |
BinTreeAVL & | operator= (const BinTreeAVL &) noexcept=default |
BinTreeAVL & | operator= (BinTreeAVL &&) noexcept=default |
operator bool () const noexcept | |
Check if the binary tree is not empty. More... | |
bool | empty () const noexcept |
Is the binary tree empty? More... | |
size_t | size () const noexcept |
Get the binary tree size. More... | |
T * | root () noexcept |
Get the root binary tree item. More... | |
const T * | root () const noexcept |
T * | lowest () noexcept |
Get the lowest binary tree item. More... | |
const T * | lowest () const noexcept |
T * | highest () noexcept |
Get the highest binary tree item. More... | |
const T * | highest () const noexcept |
bool | compare (const T &item1, const T &item2) const noexcept |
Compare two items: if the first item is less than the second one? More... | |
iterator | begin () noexcept |
Get the begin binary tree iterator. More... | |
const_iterator | begin () const noexcept |
const_iterator | cbegin () const noexcept |
iterator | end () noexcept |
Get the end binary tree iterator. More... | |
const_iterator | end () const noexcept |
const_iterator | cend () const noexcept |
reverse_iterator | rbegin () noexcept |
Get the reverse begin binary tree iterator. More... | |
const_reverse_iterator | rbegin () const noexcept |
const_reverse_iterator | crbegin () const noexcept |
reverse_iterator | rend () noexcept |
Get the reverse end binary tree iterator. More... | |
const_reverse_iterator | rend () const noexcept |
const_reverse_iterator | crend () const noexcept |
iterator | find (const T &item) noexcept |
Find the iterator which points to the first equal item in the binary tree or return end iterator. More... | |
const_iterator | find (const T &item) const noexcept |
iterator | lower_bound (const T &item) noexcept |
Find the iterator which points to the first item that not less than the given item in the binary tree or return end iterator. More... | |
const_iterator | lower_bound (const T &item) const noexcept |
iterator | upper_bound (const T &item) noexcept |
Find the iterator which points to the first item that greater than the given item in the binary tree or return end iterator. More... | |
const_iterator | upper_bound (const T &item) const noexcept |
std::pair< iterator, bool > | insert (T &item) noexcept |
Insert a new item into the binary tree. More... | |
std::pair< iterator, bool > | insert (const const_iterator &position, T &item) noexcept |
Insert a new item into the binary tree with a position hint. More... | |
T * | erase (const T &item) noexcept |
Erase the given item from the binary tree. More... | |
iterator | erase (const iterator &it) noexcept |
Erase the given item from the binary tree. More... | |
void | clear () noexcept |
Clear the binary tree. More... | |
void | swap (BinTreeAVL &bintree) noexcept |
Swap two instances. More... | |
Friends | |
template<typename U , typename UCompare > | |
void | swap (BinTreeAVL< U, UCompare > &bintree1, BinTreeAVL< U, UCompare > &bintree2) noexcept |
Intrusive balanced AVL binary tree container.
Not thread-safe.
Overview
In computer science, an AVL tree is a self-balancing binary search tree, and the first such data structure to be invented. In an AVL tree the heights of the two child subtrees of any node differ by at most one, therefore it is also called height-balanced. Lookup, insertion, and deletion all take O(log n) time in both the average and worst cases. Additions and deletions may require the tree to be rebalanced by one or more tree rotations.
The AVL tree is named after its two inventors, G.M. Adelson-Velsky and E.M. Landis, who published it in their 1962 paper "An algorithm for the organization of information."
The balance factor of a node is the height of its right subtree minus the height of its left subtree. A node with balance factor 1, 0, or -1 is considered balanced. A node with any other balance factor is considered unbalanced and requires rebalancing the tree. The balance factor is either stored directly at each node or computed from the heights of the subtrees.
While AVL trees are theoretically quite sound, they are not commonly implemented due to their high implementation complexity to keep it balanced, making development less effective when compared to self- correcting tree structures, such as splay trees or heaps. They do, however, perform better than e.g. red-black trees. They are widely used in academic settings as an instructional data structure.
Operations
The basic operations of an AVL tree generally involve carrying out the same algorithms as would be carried out on an unbalanced binary search tree, but preceded or followed by one or more of the so-called "AVL
rotations."
Insertion
Insertion into an AVL tree may be carried out by inserting the given value into the tree as if it were an unbalanced binary search tree, and then retracing one's steps toward the root, rotating about any nodes which have become unbalanced during the insertion (see tree rotation). Since at most 1.5 times lg n nodes are retraced on the journey back to the root, and each AVL rotation takes constant time, the insertion process in total takes O(log n) time.
Deletion
Deletion from an AVL tree may be carried out by rotating the node to be deleted down into a leaf node, and then pruning off that leaf node directly. Since at most log n nodes are rotated during the rotation into the leaf, and each AVL rotation takes constant time, the deletion process in total takes O(log n) time.
Practically, this is a large overhead and complex to program. Therefore, it's more common to implement a lazy deletion – leave the deletion target in place, flag it as "deleted", and replace it with an inserted node if they would occupy the same spot.
Lookup
Lookup in an AVL tree is performed exactly as in an unbalanced binary search tree, and thus takes O(log n) time, since an AVL tree is always kept balanced. No special provisions need to be taken, and the tree's structure is not modified by lookups. (This is in contrast to splay tree lookups, which do modify their tree's structure.)
Usage
AVL trees are faster than Red-Black trees when lookups are more frequent than inserts/deletes and comparisons are expensive.
References
Taken from:
AVL tree from Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/AVL_tree
Definition at line 99 of file bintree_avl.h.
typedef BinTreeConstIterator<BinTreeAVL<T, TCompare>, T> CppCommon::BinTreeAVL< T, TCompare >::const_iterator |
Definition at line 112 of file bintree_avl.h.
typedef const value_type* CppCommon::BinTreeAVL< T, TCompare >::const_pointer |
Definition at line 108 of file bintree_avl.h.
typedef const value_type& CppCommon::BinTreeAVL< T, TCompare >::const_reference |
Definition at line 106 of file bintree_avl.h.
typedef BinTreeConstReverseIterator<BinTreeAVL<T, TCompare>, T> CppCommon::BinTreeAVL< T, TCompare >::const_reverse_iterator |
Definition at line 114 of file bintree_avl.h.
typedef ptrdiff_t CppCommon::BinTreeAVL< T, TCompare >::difference_type |
Definition at line 109 of file bintree_avl.h.
typedef BinTreeIterator<BinTreeAVL<T, TCompare>, T> CppCommon::BinTreeAVL< T, TCompare >::iterator |
Definition at line 111 of file bintree_avl.h.
typedef value_type* CppCommon::BinTreeAVL< T, TCompare >::pointer |
Definition at line 107 of file bintree_avl.h.
typedef value_type& CppCommon::BinTreeAVL< T, TCompare >::reference |
Definition at line 105 of file bintree_avl.h.
typedef BinTreeReverseIterator<BinTreeAVL<T, TCompare>, T> CppCommon::BinTreeAVL< T, TCompare >::reverse_iterator |
Definition at line 113 of file bintree_avl.h.
typedef size_t CppCommon::BinTreeAVL< T, TCompare >::size_type |
Definition at line 110 of file bintree_avl.h.
typedef TCompare CppCommon::BinTreeAVL< T, TCompare >::value_compare |
Definition at line 104 of file bintree_avl.h.
typedef T CppCommon::BinTreeAVL< T, TCompare >::value_type |
Definition at line 103 of file bintree_avl.h.
|
inlineexplicitnoexcept |
Definition at line 127 of file bintree_avl.h.
|
inlinenoexcept |
Definition at line 13 of file bintree_avl.inl.
|
defaultnoexcept |
|
defaultnoexcept |
|
defaultnoexcept |
|
inlinenoexcept |
Definition at line 71 of file bintree_avl.inl.
|
inlinenoexcept |
Get the begin binary tree iterator.
Definition at line 65 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 77 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 95 of file bintree_avl.inl.
|
inlinenoexcept |
Clear the binary tree.
Definition at line 794 of file bintree_avl.inl.
|
inlinenoexcept |
Compare two items: if the first item is less than the second one?
Definition at line 161 of file bintree_avl.h.
|
inlinenoexcept |
Definition at line 113 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 131 of file bintree_avl.inl.
|
inlinenoexcept |
Is the binary tree empty?
Definition at line 145 of file bintree_avl.h.
|
inlinenoexcept |
Definition at line 89 of file bintree_avl.inl.
|
inlinenoexcept |
Get the end binary tree iterator.
Definition at line 83 of file bintree_avl.inl.
|
inlinenoexcept |
Erase the given item from the binary tree.
it | - Iterator to the erased item |
Definition at line 380 of file bintree_avl.inl.
|
inlinenoexcept |
Erase the given item from the binary tree.
item | - Item to erase |
Definition at line 374 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 143 of file bintree_avl.inl.
|
inlinenoexcept |
Find the iterator which points to the first equal item in the binary tree or return end iterator.
Definition at line 137 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 49 of file bintree_avl.inl.
|
inlinenoexcept |
Get the highest binary tree item.
Definition at line 43 of file bintree_avl.inl.
|
inlinenoexcept |
Insert a new item into the binary tree with a position hint.
position | - Iterator position to the inserted item |
item | - Item to insert |
Definition at line 266 of file bintree_avl.inl.
|
inlinenoexcept |
Insert a new item into the binary tree.
item | - Item to insert |
Definition at line 260 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 185 of file bintree_avl.inl.
|
inlinenoexcept |
Find the iterator which points to the first item that not less than the given item in the binary tree or return end iterator.
Definition at line 179 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 27 of file bintree_avl.inl.
|
inlinenoexcept |
Get the lowest binary tree item.
Definition at line 21 of file bintree_avl.inl.
|
inlineexplicitnoexcept |
Check if the binary tree is not empty.
Definition at line 142 of file bintree_avl.h.
|
defaultnoexcept |
|
defaultnoexcept |
|
inlinenoexcept |
Definition at line 107 of file bintree_avl.inl.
|
inlinenoexcept |
Get the reverse begin binary tree iterator.
Definition at line 101 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 125 of file bintree_avl.inl.
|
inlinenoexcept |
Get the reverse end binary tree iterator.
Definition at line 119 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 152 of file bintree_avl.h.
|
inlinenoexcept |
Get the root binary tree item.
Definition at line 151 of file bintree_avl.h.
|
inlinenoexcept |
Get the binary tree size.
Definition at line 148 of file bintree_avl.h.
|
inlinenoexcept |
Swap two instances.
Definition at line 801 of file bintree_avl.inl.
|
inlinenoexcept |
Definition at line 229 of file bintree_avl.inl.
|
inlinenoexcept |
Find the iterator which points to the first item that greater than the given item in the binary tree or return end iterator.
Definition at line 223 of file bintree_avl.inl.
|
friend |