|
Шаблон AVL_Tree предназначен для представления сбалансированного бинарного дерева, предложенного советскими учёными Г.М. Адельсоном-Вельским и Е.М. Ландисом в 1962 году. При разработке этого шаблона использовалась книга Н. Вирта "Алгоритмы и структуры данных":
template <class T> class AVL_Tree
{
public:
struct Node
{
T key;
Node * left, * right;
int bal;
};
class NodeStor
{
public:
virtual Node * get() = 0;
virtual void put ( Node * ) = 0;
};
private:
Node * root;
NodeStor * stor;
Здесь реализация следующих функций:
static const T & add ( const T & x, Node * & p, bool & h, NodeStor * stor )...
static bool delet ( const T & x, Node * & p, NodeStor * stor )...
static void delAll ( Node * p, NodeStor * stor )...
static unsigned countItems ( const Node * p )...
static bool test ( const Node * p )...
public:
AVL_Tree ( NodeStor * p = 0 ) : root ( 0 ), stor ( p ) {}
~AVL_Tree ()
{
delAll ( root, stor );
}
const T & add ( const T & x )
{
bool h;
return add ( x, root, h, stor );
}
void del ( const T & x )
{
delet ( x, root, stor );
}
const T * find ( const T & x ) const
{
const Node * p = root;
while ( p )
{
if ( p->key > x )
p = p->left;
else
if ( p->key < x )
p = p->right;
else
return & p->key;
}
return 0;
}
unsigned countItems() const
{
return countItems ( root );
}
bool test() const
{
return test ( root );
}
};
Функция-член add возвращает ссылку на добавляемый элемент, если его ещё не было в дереве, или ссылку на элемент из дерева, если он уже там был. Функция-член del удаляет элемент с указанным ключём. Функция-член find возвращает указатель на элемент с указанным ключём, если он есть, и 0 - в противном случае. Функция-член countItems подсчитывает количество элементов в дереве. Функция-член test проверяет дерево на корректность. Класс AVL_TreeNodeStor является хранилищем для узлов дерева, из которого их можно брать и возвращать обратно:
template <class T> class AVL_TreeNodeStor : public AVL_Tree<T>::NodeStor
{
AVL_Tree<T>::Node * data;
public:
AVL_TreeNodeStor() : data(0) {}
~AVL_TreeNodeStor()
{
while ( data )
{
AVL_Tree<T>::Node * p = data->left;
delete data;
data = p;
}
}
virtual AVL_Tree<T>::Node * get()
{
if ( data )
{
AVL_Tree<T>::Node * p = data;
data = p->left;
return p;
}
else
return new AVL_Tree<T>::Node;
}
virtual void put ( AVL_Tree<T>::Node * p )
{
p->left = data;
data = p;
}
const T * find ( const T & x ) const
{
const AVL_Tree<T>::Node * p = data;
while ( p )
{
if ( p->key == x ) return & p->key;
p = p->left;
}
return 0;
}
};
Исходники находятся в файле AVL_Tree.h. Наверх |