0001 template <typename T, bool H> bool BST<T, H>::remove(const T& e) { 0002 search(e); if (!_x) return false; //确认目标存在(留意_p的设置) 0003 if (_x->lc && _x->rc) { //双子情况,可转化为单子情况... 0004 BNP<T> s = eov(_x->rc); swap(_x->data, s->data); //直接后继,s代_x僵 0005 _x = s; _p = s->parent; //转移删除操作的焦点 0006 } //以下,_x至多只有一个孩子(可左可右) 0007 _r = _x->lc ? _x->lc : _x->rc; //以单子r为接替者(仍可能是nullptr) 0008 if (_r) _r->parent = _p; //_r以_p为父 0009 (_p ? (_p->lc == _x ? _p->lc : _p->rc) : _root) = _r; //_p以_r为子 0010 delete _x; _x = nullptr; _size--; //释放_x,更新全树规模 0011 if (H && _p) //更新祖先们的高度 0012 _p->updateHeightAbove(); //派生的AVL树、红黑树会重写remove(),并以自己的方式更新高度 0013 return true; 0014 } //删除成功与否,由返回值指示