红黑树源码

Interface.h

#ifndef REDBLACKTREE_H
#define REDBLACKTREE_H
#include"DataType.h"
//红黑树
Interface IRedBlackTree
{ //插入节点
  virtual void InsertNode(int key,void*data)=0;
  //删除节点
  virtual bool RemoveNode(int key)=0;
  //查询节点
  virtual void* QueryNode(int key)=0;
};
extern "C" IRedBlackTree *GetCRedBlackTree(void);


CRedBlackTree.h

#ifndef CRDBLACKTREE_H
#define CRDBLACKTREE_H
#include"Interface.h"
 //数据节点
struct INode
{
   INode*            m_FNode;                    //父节点
   INode*            m_LNode;                    //左节点
   INode*            m_RNode;                    //右节点
   int               m_key;                      //箭值
   int               m_Coordinate;               //坐标
   bool              m_Colour;                   //颜色
   void *            m_Data;                     //数据
   INode();
};
 //红黑树                    
 class CRedBlackTree:public IRedBlackTree
{   
  private: 
    INode *                   m_RootNode;                 //根节点
    INode *                   m_TemNode;                  //临时节点
  public:
     CRedBlackTree();
    ~CRedBlackTree();
    //插入节点
    virtual void   InsertNode(int key,void*data);
    //删除节点
    virtual bool   RemoveNode(int key);
    //查询节点
    virtual void*  QueryNode(int key);
  private:
    //平衡节点
    void BalanceRedBlackTree(INode*Node);
    //平衡节点
    void RbDeleteFixup(INode*Node);    
    //左边旋转                 
    void LeftRotation(INode*Node);  
    //右边旋转                  
    void RightRotation(INode*Node);                      
};
#endif
CRedBlackTree.cpp
#include"CRedBlackTree.h"

#define NULL           0
#define LEFT           1
#define RIGHT          2
#define ROOT           0

IRedBlackTree* GetCRedBlackTree(void)
{
 return new CRedBlackTree;
}

INode::INode()
{
    m_LNode=NULL;
    m_LNode=NULL;
    m_RNode=NULL;
    m_key=0;
    m_Coordinate=0;
    m_Colour=true;
    m_Data=NULL;
}

CRedBlackTree::CRedBlackTree()
{
   //初始化
   m_RootNode==NULL;
   m_TemNode=new INode;
}
CRedBlackTree::~CRedBlackTree()
{

}
void CRedBlackTree::InsertNode(int key,void*data)
{
    //插入的是第一个节点直接设置为根节点
    if(NULL==m_RootNode)
    {
        m_RootNode=new INode;
        m_RootNode->m_LNode=NULL;
        m_RootNode->m_RNode=NULL;
        m_RootNode->m_key=key;
        m_RootNode->m_Data=data;
        m_RootNode->m_Coordinate=0;
        m_RootNode->m_Colour=false;
        return ;
    }
    else
    {
        INode* TempNode=m_RootNode;
        while(NULL!=TempNode)
        {
            if(key<TempNode->m_key)
            {
                if(NULL==TempNode->m_LNode)
                {   INode*strNode=new INode;
                    TempNode->m_LNode=strNode;
                    strNode->m_FNode=TempNode;
                    strNode->m_RNode=NULL;
                    strNode->m_LNode=NULL;
                    strNode->m_Data=data;
                    strNode->m_key=key;
                    strNode->m_Coordinate=LEFT;

                    BalanceRedBlackTree(strNode);
                    return;
                }
                TempNode=TempNode->m_LNode;
            }
            else
            {
                if(NULL==TempNode->m_RNode)
                {   INode*strNode=new INode;
                    TempNode->m_RNode=strNode;
                    strNode->m_FNode=TempNode;
                    strNode->m_LNode=NULL;
                    strNode->m_RNode=NULL;
                    strNode->m_Coordinate=RIGHT;
                    strNode->m_key=key;
                    BalanceRedBlackTree(strNode);
                    return;
                }
                TempNode=TempNode->m_RNode;
            }
        }
    }
}
bool CRedBlackTree::RemoveNode(int key)
{
    INode* TempNode=m_RootNode;
    while(NULL!=TempNode)
    {
        if(key==TempNode->m_key)
        {
            INode* TempY=NULL;
            INode* TempX=NULL;
            if(NULL==TempNode->m_LNode||NULL==TempNode->m_RNode)
            {
                TempY=TempNode;
            }
            else
            {
                //记录当前节点的后继节点
                TempY=TempNode->m_RNode;
                while(TempY->m_LNode!=NULL)
                {
                    TempY=TempY->m_LNode;
                }
            }
            // 若TempY的左孩子不为空 则将Tempy的左孩子 赋值给TempX
            if(NULL!=TempY->m_LNode)
                TempX=TempY->m_LNode;
            //否则TempY的右孩子赋值给TempX
            else
                TempX=TempY->m_RNode;

            if(NULL!=TempX)
            {
                TempX->m_FNode=TempY->m_FNode;
                TempX->m_Coordinate=TempY->m_Coordinate;
            }
            else
            {
                m_TemNode->m_Colour=false;
                m_TemNode->m_FNode=TempY->m_FNode;
                m_TemNode->m_Coordinate=TempY->m_Coordinate;
            }
            if(TempY->m_Coordinate==LEFT)
                TempY->m_FNode->m_LNode=TempX;
            else if(TempY->m_Coordinate==RIGHT)
                TempY->m_FNode->m_RNode=TempX;
            else if(TempY->m_Coordinate==ROOT)
                m_RootNode=TempX;
            //
            if(TempY!=TempNode)
            {
                TempNode->m_key=TempY->m_key;
                TempNode->m_Data=TempY->m_Data;
            }

            if(TempY->m_Colour==false)
            {
                RbDeleteFixup(TempX==NULL?m_TemNode:TempX);
            }
            delete TempY;
            return true;
        }
        else if(key<TempNode->m_key)
            TempNode=TempNode->m_LNode;
        else
            TempNode=TempNode->m_RNode;
    }
   return false;
}
void* CRedBlackTree::QueryNode(int key)
{
    INode* TempNode=m_RootNode;
    while(NULL!=TempNode)
     {
        if(key==TempNode->m_key)
        {
            return TempNode->m_Data;
        }
        else if(key<TempNode->m_key)
        {
            TempNode=TempNode->m_LNode;
        }
        else
        {
            TempNode=TempNode->m_RNode;
        }
     }
     return NULL;
}
void CRedBlackTree::BalanceRedBlackTree(INode*Node)
{
    INode*TempNode=Node->m_FNode;
    //
    bool FatherColour=TempNode->m_Colour;
    while(FatherColour)
    {
        //当前节点都为红色
        if(Node->m_Colour)
        {
            //查看叔叔节点的的颜色
            bool UncleColour=(TempNode->m_Coordinate==LEFT?
            (TempNode->m_FNode->m_RNode==NULL ? false :TempNode->m_FNode->m_RNode->m_Colour):
            (TempNode->m_FNode->m_LNode==NULL ? false:TempNode->m_FNode->m_LNode->m_Colour));
            //叔叔节点是红色父节点是红色当前节点是红色
            if(UncleColour)
            {   //父节点是祖父节点的左节点
                if(TempNode->m_Coordinate==LEFT)
                  ((TempNode->m_FNode)->m_RNode)->m_Colour=false;
                else
                  ((TempNode->m_FNode)->m_LNode)->m_Colour=false;

                TempNode->m_Colour=false;
                TempNode->m_FNode->m_Colour=true;
                //将祖父节点设为当前节点
                Node=TempNode->m_FNode;
                TempNode=Node->m_FNode;
            }
            else
            {   //父节点是祖父节点的左节点
                if(TempNode->m_Coordinate==LEFT)
                {
                    //父节点的是红色叔叔节点是黑色当前节点是右孩子
                    if(Node->m_Coordinate==RIGHT)
                    {
                        LeftRotation(TempNode);
                        Node=TempNode;
                        TempNode=Node->m_FNode;
                    }
                    //父节点的是红色叔叔节点是黑色当前节点是左孩子
                    else if(Node->m_Coordinate==LEFT)
                    {
                        TempNode->m_Colour=false;
                        TempNode->m_FNode->m_Colour=true;
                        RightRotation(TempNode->m_FNode);
                    }
                }
                else
                {
                    //父节点的是红色叔叔节点是黑色当前节点是右孩子
                    if(Node->m_Coordinate==RIGHT)
                    {
                        TempNode->m_Colour=false;
                        TempNode->m_FNode->m_Colour=true;
                        LeftRotation(TempNode->m_FNode);
                    }
                    //父节点的是红色叔叔节点是黑色当前节点是左孩子
                    else if(Node->m_Coordinate==LEFT)
                    {

                        RightRotation(TempNode);
                        Node=TempNode;
                        TempNode=Node->m_FNode;
                    }
                }
            }
            FatherColour=TempNode==NULL?false:TempNode->m_Colour;
        }
       m_RootNode->m_Colour=false;
    }
    return;
}
void CRedBlackTree::RbDeleteFixup(INode*TempNode)
{
  while(TempNode!=m_RootNode&&TempNode->m_Colour==false)
   {

        if(TempNode->m_Coordinate==LEFT)
        {   INode* BrotherNode=TempNode->m_FNode->m_RNode;
            bool BrotherColour=BrotherNode==NULL ?false:BrotherNode->m_Colour;
            bool BrotherLeftColour=true;
            bool BrotherRightColour=true;
            if(BrotherColour)
            {
                BrotherNode->m_Colour=false;
                TempNode->m_FNode->m_Colour=true;
                LeftRotation(TempNode->m_FNode);
                BrotherNode=TempNode->m_FNode->m_RNode;
            }
            if(NULL!=BrotherNode)
            {
                BrotherLeftColour= BrotherNode->m_LNode!=NULL ?BrotherNode->m_LNode->m_Colour:false;
                BrotherRightColour=BrotherNode->m_RNode!=NULL ?BrotherNode->m_RNode->m_Colour:false;
            }
            //兄弟节点为黑色,兄弟节点的左右孩子都为黑色
            if(NULL!=BrotherNode&&!BrotherColour&&!BrotherLeftColour&&!BrotherRightColour)
            {
                BrotherNode->m_Colour=true;
                TempNode=TempNode->m_FNode;
            }
            else
            {
                //兄弟节点为黑色,兄弟节点左孩子红色,右孩子黑色。
                if(NULL!=BrotherNode&&!BrotherColour&&!BrotherRightColour)
                {   if(BrotherLeftColour)
                       BrotherNode->m_LNode->m_Colour=false;
                    BrotherNode->m_Colour=true;
                    RightRotation(BrotherNode);
                    BrotherNode=TempNode->m_FNode->m_RNode;
                }
                if(NULL!=BrotherNode)
                {
                    BrotherLeftColour= BrotherNode->m_LNode!=NULL ?BrotherNode->m_LNode->m_Colour:false;
                    BrotherRightColour=BrotherNode->m_RNode!=NULL ?BrotherNode->m_RNode->m_Colour:false;
                }
                //兄弟节点为黑色,右孩子为红色
                if(NULL!=BrotherNode&&!BrotherColour)
                {
                    BrotherNode->m_Colour=TempNode->m_FNode->m_Colour;
                    TempNode->m_FNode->m_Colour=false;
                    if(BrotherRightColour)
                       BrotherNode->m_RNode->m_Colour=false;

                    LeftRotation(TempNode->m_FNode);
                    TempNode=m_RootNode;
                }
            }
        }
        else
        {   INode* BrotherNode=TempNode->m_FNode->m_LNode;
            bool BrotherColour=BrotherNode==NULL ?false:BrotherNode->m_Colour;
            bool BrotherLeftColour=true;
            bool BrotherRightColour=true;
            if(BrotherColour)
            {
                BrotherNode->m_Colour=false;
                TempNode->m_FNode->m_Colour=true;
                RightRotation(TempNode->m_FNode);
                BrotherNode=TempNode->m_FNode->m_LNode;
            }
            if(NULL!=BrotherNode)
            {
                BrotherLeftColour= BrotherNode->m_LNode!=NULL ?BrotherNode->m_LNode->m_Colour:false;
                BrotherRightColour=BrotherNode->m_RNode!=NULL ?BrotherNode->m_RNode->m_Colour:false;
            }
            //兄弟节点为黑色,兄弟节点的左右孩子都为黑色
            if(NULL!=BrotherNode&&!BrotherColour&&!BrotherLeftColour&&!BrotherRightColour)
            {
                BrotherNode->m_Colour=true;
                TempNode=TempNode->m_FNode;
            }
            else
            {
                //兄弟节点为黑色,兄弟节点左孩子红色,右孩子黑色。
                if(NULL!=BrotherNode&&!BrotherColour&&!BrotherLeftColour)
                {   if(BrotherLeftColour)
                       BrotherNode->m_RNode->m_Colour=false;
                    BrotherNode->m_Colour=true;
                    LeftRotation(BrotherNode);
                    BrotherNode=TempNode->m_FNode->m_LNode;
                }
                if(NULL!=BrotherNode)
                {
                    BrotherLeftColour= BrotherNode->m_LNode!=NULL ?BrotherNode->m_LNode->m_Colour:false;
                    BrotherRightColour=BrotherNode->m_RNode!=NULL ?BrotherNode->m_RNode->m_Colour:false;
                }
                //兄弟节点为黑色,右孩子为红色
                if(NULL!=BrotherNode&&!BrotherColour)
                {
                    BrotherNode->m_Colour=TempNode->m_FNode->m_Colour;
                    TempNode->m_FNode->m_Colour=false;
                    if(BrotherLeftColour)
                       BrotherNode->m_LNode->m_Colour=false;

                    RightRotation(TempNode->m_FNode);
                    TempNode=m_RootNode;
                }
            }
        }
   }
   TempNode->m_Colour=false;
}
void CRedBlackTree::LeftRotation(INode*strNode)
{
    if(strNode->m_RNode==NULL) return;
    //记录当前节点的父节点
    INode *father=strNode->m_FNode;
    //右节点和父节点相连
    strNode->m_RNode->m_FNode=father;
    strNode->m_RNode->m_Coordinate=ROOT;
    if(NULL!=father)
    {
         if(strNode->m_Coordinate==RIGHT)
           father->m_RNode=strNode->m_RNode;
           else
           father->m_LNode=strNode->m_RNode;

         strNode->m_RNode->m_Coordinate=strNode->m_Coordinate;
    }
    //记录当前节点的右节点的左节点
    INode * Left=strNode->m_RNode->m_LNode;
    //当前与右节点相连
    strNode->m_FNode=strNode->m_RNode;
    strNode->m_RNode->m_LNode=strNode;
    strNode->m_Coordinate=LEFT;
    //当前节点与右节点的左节点相连
    strNode->m_RNode=Left;
    if(NULL!=Left)
    {
        Left->m_FNode=strNode;
        Left->m_Coordinate=RIGHT;
    }
    //如果当前节点是根节点则更新根节点记录
    if(strNode->m_FNode->m_Coordinate==ROOT)
        m_RootNode=strNode->m_FNode;
    return;
}
void CRedBlackTree::RightRotation(INode*strNode)
{
//当前节点没有左节点不能右旋转
    if(NULL==strNode->m_LNode) return ;
    //记录当前节点的祖父节点
    INode *father=strNode->m_FNode;
    //记录当前节点的左节点
    INode *m_LNode=strNode->m_LNode;
    //当前节点的左节点与当前节点的父节点连接
    m_LNode->m_FNode=father;
    m_LNode->m_Coordinate=ROOT;
    if(NULL!=father)
    {    if(strNode->m_Coordinate==LEFT)
           father->m_LNode=m_LNode;
         else
           father->m_RNode=m_LNode;
         m_LNode->m_Coordinate=strNode->m_Coordinate;
    }
    //记录当前节点的左节点的右节点
    INode * Right=strNode->m_LNode->m_RNode;
    //当前节点与左节点连接
    m_LNode->m_RNode=strNode;
    strNode->m_FNode=m_LNode;
    strNode->m_Coordinate=RIGHT;
    //当前节点的左节点与当前节点的左节点的右节点连接
    strNode->m_LNode=Right;
    if(NULL!=Right)
      {
          Right->m_FNode=strNode;
          Right->m_Coordinate=LEFT;
      }
    //如果当前节点是根节点则更新根节点记录
    if(strNode->m_FNode->m_Coordinate==ROOT)
        m_RootNode=strNode->m_FNode;
    return;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值