template <typename K,typename V>
void Map<K,V>::InsertFixUp(RBNode<K,V> *pNode)
{
RBNode<K,V> * parent = NULL, *gparent=NULL ; //父结点 ,爷结点
parent = pNode ->m_parent;
gparent = parent->m_parent ; //祖父节点
while(parent->m_color==RED) //父结点是红色
{
if(parent==gparent->m_left) //父结点是祖父结点的左结点
{
RBNode<K,V> * runcle = gparent ->m_right ; //祖父的右节点为伯父节点
//Case 1: z's uncle y is red
if(runcle&&(runcle->m_color==RED))//伯父节点存在且为红
{
parent->m_color=BLACK; //伯父节点为黑
runcle->m_color=BLACK; //父节点为黑
gparent->m_color=RED; //祖父节点为红
pNode =gparent ; //到祖父
}
else
{
//Case 2: z's uncle y is black and z is a right child
if(pNode== parent->m_right) //新节点为父节点之右节点
{
pNode= parent; //到达父节点
this->LeftRotate(pNode); //左旋
}
//Case 3: z's uncle y is black and z is a left child
parent->m_color=BLACK; //父节点为黑
gparent->m_color=RED; //祖父节点为红
this->RightRotate(pNode->m_parent->m_parent);
}
}
else //父结点是祖父结点的右结点
{
RBNode<K,V> * luncle = gparent ->m_left ; //祖父的左节点为伯父节点
if(luncle && (luncle->m_color==RED))
{
parent->m_color=BLACK;
luncle->m_color=BLACK;
gparent->m_color=RED;
pNode =gparent ; //到祖父
}
else //无伯父节点或为黑
{
if(pNode == parent->m_left) //新节点为父节点之左节点
{
pNode= parent;
this->RightRotate(pNode);
}
parent->m_color=BLACK;
gparent->m_color=RED;
this->LeftRotate(gparent);
}
}
}
this->m_pRoot->m_color=BLACK;
}
template <typename K,typename V>
void Map<K,V>::Delete(K value)
{
RBNode<K,V> *pNode=Find(value);
RBNode<K,V> *py,*px;// px为儿子结点
if(pNode!=NULL)
{
if(pNode->m_left==nil||pNode->m_right ==nil) //空结点
{
py=pNode;
}
else if (pNode->m_left != nil||pNode->m_right !=nil ) //左右结点
{
py=this->Successor(pNode);
}
else if(pNode->m_left != nil||pNode->m_right ==nil) //有左结点
{
px=pNode->m_left;
}
else if(pNode->m_left==nil||pNode->m_right !=nil) //只有右结点
{
px=py->m_right;
}
px->m_parent=py->m_parent;
if(py->m_parent==nil)
{
m_pRoot=px;
}
else if(py->m_parent->m_left=py)
{
py->m_parent->m_left=px;
}
else
{
py->m_parent->m_right=px;
}
bool isFix=py->m_color==BLACK?true:false;
if(py==pNode)
{
py->m_parent=pNode->m_parent;
py->m_left=pNode->m_left;
py->m_right=pNode->m_right;
py->m_color=pNode->m_color;
// delete pNode;
}
if(isFix)
DeleteFixUp(px);
}
}