template <typename Key, typename Element> class AVLTree : public BinarySearchTree<Key, Element, AVLItem<Key, Element> > { protected: // local types typedef AVLItem<Key, Element> Item; // a tree node item typedef BinarySearchTree<Key, Element, Item> BST; // base search tree typedef BST::BTPosition BTPosition; // a tree position public: // public types typedef BST::Position Position; // position // ... (insert AVLItem here) protected: // local utilities int height(const BTPosition& p) const { // get height of p if(T.isExternal(p)) return 0; else return p.element().height(); } void setHeight(BTPosition p) { // set height of p int leftHeight = height(T.leftChild(p)); int rightHeight = height(T.rightChild(p)); int maxHeight = max(leftHeight, rightHeight); p.element().setHeight(1 + maxHeight); } bool isBalanced(const BTPosition& p) const { // is p balanced? int bf = height(T.leftChild(p)) - height(T.rightChild(p)); return ((-1 <= bf) && (bf <= 1)); } BTPosition tallGrandchild(const BTPosition& p) const; // get tallest grandchild // ... (insert rebalance() here) public: AVLTree() : BST() { } // constructor void insertItem(const Key& k, const Element& e) { // insert (key,element) BTPosition p = inserter(k, e); // insert in base tree setHeight(p); // compute its height rebalance(p); // rebalance if needed } void removeElement(const Key& k) // remove using key throw(NonexistentElementException) { BTPosition p = finder(k, T.root()); // find in base tree if (p.isNull()) // not found? throw NonexistentElementException("Remove nonexistent element"); BTPosition r = remover(p); // remove it rebalance(r); // rebalance if needed } };