// ... (utilities for LinkedBinaryTree)
NodePtr nodePtr(const Position& v) const // convert to NodePtr
{ return v.node; }
bool isExternal(NodePtr n) const // is node external?
{ return (n->left == NULL && n->right == NULL); }
bool isInternal(NodePtr n) const // is node internal?
{ return ! isExternal(n); }
bool isRoot(NodePtr n) const // is node the root?
{ return (n == theRoot); }
void setRoot(NodePtr r) // make r the root
{ theRoot = r; r->parent = NULL; }
void replaceElement(NodePtr n, const Object& o) // replace element
{ n->element = o; }
void swapElements(NodePtr n, NodePtr w) { // swap elements
Object temp = w->element;
w->element = n->element;
n->element = temp;
}
void expandExternal(NodePtr n) { // expand external node
n->left = new Node; n->left->parent = n;
n->right = new Node; n->right->parent = n;
sz += 2;
}
NodePtr removeAboveExternal(NodePtr n) { // remove n and parent
NodePtr p = n->parent;
NodePtr s = n->sibling();
if (isRoot(p)) setRoot(s); // p was root; now s is
else {
NodePtr g = p->parent; // the grandparent
if (p == g->left) g->left = s; // replace parent by sibling
else g->right = s;
s->parent = g;
}
delete n; delete p; // delete removed nodes
sz -= 2; // two fewer nodes
return s;
}