Деревья

Шаблон 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.

Наверх