template <typename Object>
class LinkedBinaryTree {
protected:
// ... (insert Node definition here)
public:
// ... (insert Position definition here)
private: // member data
NodePtr theRoot; // pointer to the root
int sz; // number of nodes
protected: // protected utilities
// ... (insert LinkedBinaryTree utilities here)
public:
LinkedBinaryTree() // constructor
{ theRoot = new Node; sz = 1; }
int size() const // size of tree
{ return sz; }
bool isEmpty() const // is tree empty?
{ return (sz == 0); }
Position root() const // returns root
{ return Position(theRoot); }
Position leftChild(const Position& v) const // returns left child
{ return Position(nodePtr(v)->left); }
// ... (rightChild(), parent(), and sibling() are omitted but similar)
bool isRoot(const Position& v) const // is v the root?
{ return isRoot(nodePtr(v)); }
bool isInternal(const Position& v) const // is v internal?
{ return isInternal(nodePtr(v)); }
bool isExternal(const Position& v) const // is v external?
{ return isExternal(nodePtr(v)); }
void replaceElement(const Position& v, const Object& o)
{ replaceElement(nodePtr(v), o); } // replace element
void swapElements(const Position& v, const Position& w)
{ swapElements(nodePtr(v), nodePtr(w)); } // swap elements
void expandExternal(const Position& v)
{ expandExternal(nodePtr(v)); } // expand external node
Position removeAboveExternal(const Position& v) // remove v and parent
{ return Position(removeAboveExternal(nodePtr(v))); }
// ... (housekeeping and iterator functions omitted)
};