//全局函数,用于删除节点后调整树形
//__z为待删除点,__root为根节点,__leftmost左极点,__rightmost为右极点
inline _Rb_tree_node_base*
_Rb_tree_rebalance_for_erase(_Rb_tree_node_base* __z,
_Rb_tree_node_base*& __root,
_Rb_tree_node_base*& __leftmost,
_Rb_tree_node_base*& __rightmost)
{
_Rb_tree_node_base* __y = __z; //调整后实际被删除点的指针
_Rb_tree_node_base* __x = 0; //__y的某个子节点
_Rb_tree_node_base* __x_parent = 0; //__x的父节点
if (__y->_M_left == 0) //__z最多有右子节点一个非空子节点,__y=__z
__x = __y->_M_right; // __x可能为空
else
if (__y->_M_right == 0) // __z确实有一个非空左子节点(因为上个if的限定). y == z.
__x = __y->_M_left; // __x不为空
else { // __z 有两个非空子节点,设定__y为__z的后继,
__y = __y->_M_right; // __x为__y的右节点,__x可能为空
while (__y->_M_left != 0)
__y = __y->_M_left;
__x = __y->_M_right;
}
if (__y != __z) { // 重新设置__y的链接以取代__z,__y是__z的后继
__z->_M_left->_M_parent = __y; //在__y!=__z是__z的左子节点
__y->_M_left = __z->_M_left; //一定会设置为__y的左子节点
if (__y != __z->_M_right) { //__y不为__z的右子节点是
__x_parent = __y->_M_parent;
if (__x) __x->_M_parent = __y->_M_pare