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