二叉树系列之三:红黑树

 红黑树是一种特殊的二叉搜索树。它的实现主要是在二叉搜索树的插入和删除上进行一定的旋转操作,以维持红黑树的特性。

下面是红黑树的实现:

#ifndef _RB_TREE_H_
#define  _RB_TREE_H_

#include 
" BSTree.h "

template 
< class  T >
class  RBTree :  public  BSTree < T >
{
public:
    RBTree(T data 
= T()) : BSTree(data) { }
    
virtual ~RBTree() { }

public:
    
void insert(T data)
    
{
        BSTree
<T>::insert(data);
        
        rbnode_
->color_ = RED;
        rbnode_
->lchild_ = BTNode<T>::nil();
        rbnode_
->rchild_ = BTNode<T>::nil();

        BTNode
<T> *= BTNode<T>::nil();
        
while (rbnode_->parent_->color_ == RED)
        
{
            
if (rbnode_->parent_ == rbnode_->parent_->parent_->lchild_) 
            
{
                y 
= rbnode_->parent_->parent_->rchild_;
                
if (y->color_ == RED)
                
{
                    rbnode_
->parent_->color_ = BLACK;
                    y
->color_ = BLACK;
                    rbnode_
->parent_->parent_->color_ = RED;
                    rbnode_ 
= rbnode_->parent_->parent_;
                }

                
else if (rbnode_ == rbnode_->parent_->rchild_)
                
{
                    rbnode_ 
= rbnode_->parent_;
                    rotateLeft(rbnode_);  
                }

                
else
                
{
                    rbnode_
->parent_->color_ = BLACK;
                    rbnode_
->parent_->parent_->color_ = RED;                
                    rotateRight(rbnode_
->parent_->parent_);
                }

            }

            
else
            
{
                y 
= rbnode_->parent_->parent_->lchild_;
                
if (y->color_ == RED)
                
{
                    rbnode_
->parent_->color_ = BLACK;
                    y
->color_ = BLACK;
                    rbnode_
->parent_->parent_->color_ = RED;
                    rbnode_ 
= rbnode_->parent_->parent_;
                }

                
else if (rbnode_ == rbnode_->parent_->lchild_)
                
{
                    rbnode_ 
= rbnode_->parent_;
                    rotateRight(rbnode_);
                }

                
else
                
{
                    rbnode_
->parent_->color_ = BLACK;
                    rbnode_
->parent_->parent_->color_ = RED;                
                    rotateLeft(rbnode_
->parent_->parent_);
                }

            }

        }

        root_
->color_ = BLACK;
    }


    
void remove(T data)
    
{
        BSTree
<T>::remove(data);
        
if (rbnode_ == BTNode<T>::nil()) return;

        BTNode
<T> *= BTNode<T>::nil();
        
while (rbnode_ != root_ && rbnode_->color_ == BLACK)
        
{
            
if (rbnode_ == rbnode_->parent_->lchild_)
            
{
                y 
= rbnode_->parent_->rchild_;
                
if (y->color_ == RED)
                
{
                    y
->color_ = BLACK;
                    rbnode_
->parent_->color_ = RED;
                    rotateLeft(rbnode_
->parent_);
                    y 
= rbnode_->parent_->rchild_;
                }

                
else if (y->lchild_->color_ == BLACK && y->rchild_->color_ == BLACK)
                
{
                    y
->color_ = RED;
                    rbnode_ 
= rbnode_->parent_;
                }

                
else if (y->rchild_->color_ == BLACK)
                
{
                    y
->lchild_->color_ = BLACK;
                    y
->color_ = RED;
                    rotateRight(y);
                    y 
= rbnode_->parent_->rchild_;
                }

                
else
                
{
                    y
->color_ = rbnode_->parent_->color_;
                    rbnode_
->parent_->color_ = BLACK;
                    y
->rchild_->color_ = BLACK;
                    rotateLeft(rbnode_
->parent_);
                    rbnode_ 
= root_;
                }

            }

            
else
            
{
                y 
= rbnode_->parent_->lchild_;
                
if (y->color_ == RED)
                
{
                    y
->color_ = BLACK;
                    rbnode_
->parent_->color_ = RED;
                    rotateRight(rbnode_
->parent_);
                    y 
= rbnode_->parent_->lchild_;
                }

                
else if (y->rchild_->color_ == BLACK && y->lchild_->color_ == BLACK)
                
{
                    y
->color_ = RED;
                    rbnode_ 
= rbnode_->parent_;
                }

                
else if (y->lchild_->color_ == BLACK)
                
{
                    y
->rchild_->color_ = BLACK;
                    y
->color_ = RED;
                    rotateLeft(y);
                    y 
= rbnode_->parent_->lchild_;
                }

                
else
                
{
                    y
->color_ = rbnode_->parent_->color_;
                    rbnode_
->parent_->color_ = BLACK;
                    y
->lchild_->color_ = BLACK;
                    rotateRight(rbnode_
->parent_);
                    rbnode_ 
= root_;
                }

            }

        }

        rbnode_
->color_ = BLACK;
    }

}
;

#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值