// ... (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; }