红黑树删除

 

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);

    }

 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值