public: void removeElement(const Key& k) // remove using key throw(NonexistentElementException) { BTPosition p = finder(k, T.root()); // find the node if (p.isNull()) // not found? throw NonexistentElementException("Remove nonexistent element"); remover(p); // remove it } protected: BTPosition remover(const BTPosition& r) { // remove utility BTPosition p; if (T.isExternal(T.leftChild(r))) // left is external? p = T.leftChild(r); // remove from left else if (T.isExternal(T.rightChild(r))) // right is external? p = T.rightChild(r); // remove from right else { // both internal? p = T.rightChild(r); // p = replacement do // find leftmost in p = T.leftChild(p); // ...right subtree while (T.isInternal(p)); setItem(r, T.parent(p).element()); // copy parent(p) to r } return T.removeAboveExternal(p); // remove p and parent }