template <typename Key, typename Element> class RBTree : public BinarySearchTree<Key, Element, RBItem<Key,Element> > { protected: // local types typedef RBItem<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; // a position protected: // local utilities Color color(const BTPosition& p) const { // get position's color if (T.isExternal(p)) return BLACK; // externals are black return p.element().color(); } bool isRed(const BTPosition& p) const // is p red? { return color(p) == RED; } bool isBlack(const BTPosition& p) const // is p black? { return color(p) == BLACK; } void setRed(const BTPosition& p) // make p red { if (T.isInternal(p)) p.element().setColor(RED); } void setBlack(const BTPosition& p) // make p black { if (T.isInternal(p)) p.element().setColor(BLACK); } void setColor(const BTPosition& p, Color color) // set p's color { if (T.isInternal(p)) p.element().setColor(color); } bool hasTwoExternalChildren(const BTPosition& p) const // 2 external children? { return (T.isExternal(T.leftChild(p)) && T.isExternal(T.rightChild(p))); } bool hasRedChild(const BTPosition& p) const // does p have red child? { return (isRed(T.leftChild(p)) || isRed(T.rightChild(p))); } // ... (other utilities omitted) public: RBTree() : BST() { } // constructor // ... (insert insertItem() and removeElement() here) };