红黑树是一种特殊的二叉搜索树。它的实现主要是在二叉搜索树的插入和删除上进行一定的旋转操作,以维持红黑树的特性。
下面是红黑树的实现:
#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> *y = 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> *y = 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
#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> *y = 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> *y = 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