public:
void insertItem(const Key& k, const Element& e) { // insert (key,element)
BTPosition z = inserter(k, e); // insert in base tree
if (T.isRoot(z))
setBlack(z); // root is always black
else
remedyDoubleRed(z); // rebalance if needed
}
protected:
void remedyDoubleRed(const BTPosition& z) { // fix double-red z
BTPosition v = T.parent(z); // v is z's parent
if (T.isRoot(v) || isBlack(v)) return; // v is black, all ok
// z, v are double-red
if (isBlack(T.sibling(v))) { // Case 1: restructuring
v = T.restructure(z);
setBlack(v); // top vertex now black
setRed(T.leftChild(v)); setRed(T.rightChild(v)); // children are red
}
else { // Case 2: recoloring
setBlack(v); // make v black
setBlack(T.sibling(v)); // ..and its sibling
BTPosition u = T.parent(v); // u is v's parent
if (T.isRoot(u)) return;
setRed(u); // make u red
remedyDoubleRed(u); // may need to fix u now
}
}