红黑树为满足下列五个条件的特殊二叉树
- 每个结点要么是红的要么是黑的。
- 根结点是黑的。
- 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
- 如果一个结点是红的,那么它的两个儿子都是黑的。
- 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。
本文代码根据算法导论上的伪代码编写,按照先序、中序、后序输出。可直接运行,如有错误,欢迎大家指正~~~
black_red_tree.h:
#ifndef _RB_TREE_H_
#define _RB_TREE_H_
#include <iostream>
#include <sstream>
#include <fstream>
#include <cmath>
using namespace std;
template<class KEY>
class RB_Tree
{
private:
RB_Tree(const RB_Tree& input){}
const RB_Tree& operator=(const RB_Tree& input){}
private:
enum COLOR{RED,BLACK};
class RB_NODE
{
public:
RB_NODE()
{
right=NULL;
left=NULL;
parent=NULL;
}
COLOR RB_COLOR;
RB_NODE* right;
RB_NODE* left;
RB_NODE* parent;
KEY key;
};
public:
RB_NODE* m_nullNode;
RB_NODE* m_root;
enum ORDER_MODE
{
ORDER_MODE_PREV = 0,
ORDER_MODE_MID,
ORDER_MODE_POST
};//枚举,代表遍历树的方式(前序,中序,后序)
/*
1.BlackRedTree的构造,折构,以及判断树是否为空
*/
RB_Tree()
{
this->m_nullNode=new RB_NODE();
this->m_root=m_nullNode;
this->m_nullNode->right=this->m_root;
this->m_nullNode->left=this->m_root;
this->m_nullNode->parent=this->m_root;
this->m_nullNode->RB_COLOR=BLACK;
}
~RB_Tree()
{
clear(m_root);
delete m_nullNode;
}
bool Empty()
{
if (this->m_root==this->m_nullNode)
{
return true;
}
else
return false;
}
/*
2.BlackRedTree的搜索
*/
RB_NODE* find(KEY key)
{
RB_NODE* index=m_root;
while(index!=m_nullNode)
{
if (key<index->key)
{
index=index->left;
}
else if(key>index->key)
{
index=index->right;
}
else
break;
}
return index;
}
/*
3.BlackRedTree的插入(左旋,右旋,插入,红黑状态更新)
*/
/*
3.1左旋
*/
void RotateLeft(RB_NODE* node)
{
if (node==m_nullNode||node->right==m_nullNode)
{
return ;
}
RB_NODE* lower_right=node->right;
node->right=lower_right->left;
if (lower_right->left!=m_nullNode)
{
lower_right->left->parent=node;
}
lower_right->parent=node->parent;
if (node->parent==m_nullNode)
{
m_root=lower_right;
m_nullNode->left=m_root;
m_nullNode->right=m_root;
}
else if (node==node->parent->left)
{
node->parent->left=lower_right;
}
else
node->parent->right=lower_right;
lower_right->left=node;
node->parent=lower_right;
}
/*
3.2右旋
*/
void RotateRight(RB_NODE* node)
{
if (node==m_nullNode||node->left==m_nullNode)
{
return ;
}
RB_NODE* lower_left=node->left;
node->left=lower_left->right;
if (lower_left->right!=m_nullNode)
{
lower_left->right->parent=node;
}
lower_left->parent=node->parent;
if (node->parent==m_nullNode)
{
m_root=lower_left;
m_nullNode->left=m_root;
m_nullNode->right=m_root;
}
else if (node==node->parent->right)
{
node->parent->right=lower_left;
}
else
node->parent->left=lower_left;
lower_left->right=node;
node->parent=lower_left;
}
/*
3.3插入
*/
void Insert(KEY key)
{
RB_NODE* insert_point=m_nullNode;
RB_NODE* index=m_root;
while(index!=m_nullNode)
{
insert_point=index;
if (key<index->key)
{
index=index->left;
}
else if (key>index->key)
{
index=index->right;
}
else
return;
}
RB_NODE* insert_node=new RB_NODE();
insert_node->key=key;
insert_node->RB_COLOR=RED;
insert_node->right=m_nullNode;
insert_node->left=m_nullNode;
insert_node->parent=insert_point;
if (insert_point==m_nullNode)
{
m_root=insert_node;
m_root->parent=m_nullNode;
m_nullNode->left=m_root;
m_nullNode->right=m_root;
m_nullNode->parent=m_root;
}
else if (insert_node->key<insert_point->key)
{
insert_point->left=insert_node;
}
else
insert_point->right=insert_node;
InsertFixUp(insert_node);
}
/*
3.4红黑性质修复
*/
void InsertFixUp(RB_NODE* node)
{
while(node->parent->RB_COLOR==RED)
{
if (node->parent==node->parent->parent->left)
{
RB_NODE* uncle=node->parent->parent->right;
if (uncle->RB_COLOR==RED)
{
node->parent->RB_COLOR=BLACK;
uncle->RB_COLOR=BLACK;
node->parent->parent->RB_COLOR=RED;
node=node->parent->parent;
}
else
{
if (node==node->parent->right)
{
node=node->parent;
RotateLeft(node);
}
node->parent->RB_COLOR=BLACK;
node->parent->parent->RB_COLOR=RED;
RotateRight(node->parent->parent);
}
}
else
{
RB_NODE* uncle=node->parent->parent->left;
if (uncle->RB_COLOR==RED)
{
node->parent->RB_COLOR=BLACK;
uncle->RB_COLOR=BLACK;
node->parent->parent->RB_COLOR=RED;
node=node->parent->parent;
}
else
{
if (node==node->parent->left)
{
node=node->parent;
RotateRight(node);
}
node->parent->RB_COLOR=BLACK;
node->parent->parent->RB_COLOR=RED;
RotateLeft(node->parent->parent);
}
}
}
m_root->RB_COLOR=BLACK;
}
/*
4.BlackRedTree的删除(转换子树,找最小值节点,找最大值,删除,红黑状态修复)
*/
/*
4.1 转换子树
*/
void RB_TRANSPLANT(RB_NODE* u,RB_NODE* v)
{
if (u->parent==m_nullNode)
{
m_root=v;
m_root->parent=m_nullNode;
m_nullNode->left=m_root;
m_nullNode->right=m_root;
m_nullNode->parent=m_root;
}
else if (u==u->parent->left)
{
u->parent->left=v;
}
else
{
u->parent->right=v;
}
v->parent=u->parent;
}
/*
4.2 找最小值
*/
RB_NODE* RB_findMin(RB_NODE* node)
{
while(node->left!=m_nullNode)
{
node=node->left;
}
return node;
}
/*
4.3 找最大值
*/
RB_NODE* RB_findMax(RB_NODE* node)
{
while(node->right!=m_nullNode)
{
node=node->right;
}
return node;
}
/*
4.4 删除
*/
bool Delete(KEY key)
{
RB_NODE* delete_node=find(key);
if (delete_node==m_nullNode)
{
return false;
}
RB_NODE* delete_point=delete_node;
RB_NODE* delete_point_child;
COLOR Original_color=delete_point->RB_COLOR;
if (delete_node->left==m_nullNode)
{
delete_point_child=delete_node->right;
RB_TRANSPLANT(delete_node,delete_node->right);
}
else if (delete_node->right==m_nullNode)
{
delete_point_child=delete_node->left;
RB_TRANSPLANT(delete_node,delete_node->left);
}
else
{
delete_point=RB_findMin(delete_node->right);
Original_color=delete_point->RB_COLOR;
delete_point_child=delete_point->right;
if (delete_point->parent==delete_node)
{
delete_point_child->parent=delete_point;
}
else
{
RB_TRANSPLANT(delete_point,delete_point->right);
delete_point->right=delete_node->right;
delete_point->right->parent=delete_point;
}
RB_TRANSPLANT(delete_node,delete_point);
delete_point->left=delete_node->left;
delete_point->left->parent=delete_point;
delete_point->RB_COLOR=delete_node->RB_COLOR;
}
if (Original_color==BLACK)
{
DeleteFixUp(delete_point_child);
}
delete delete_node;
return true;
}
/*
4.5 红黑性质修复
*/
void DeleteFixUp(RB_NODE* node)
{
while(node!=m_root&&node->RB_COLOR==BLACK)
{
if (node==node->parent->left)
{
RB_NODE* brother=node->parent->right;
if (brother->RB_COLOR==RED)
{
brother->RB_COLOR=BLACK;
node->parent->RB_COLOR=RED;
RotateLeft(node->parent);
brother=node->parent->right;
}
else
{
if (brother->left->RB_COLOR==BLACK&&brother->right->RB_COLOR==BLACK)
{
brother->RB_COLOR=RED;
node=node->parent;
}
else if (brother->right->RB_COLOR==BLACK)
{
brother->left->RB_COLOR=BLACK;
brother->RB_COLOR=RED;
RotateRight(brother);
brother=node->parent->right;
}
else if (brother->right->RB_COLOR==RED)
{
brother->RB_COLOR=node->parent->RB_COLOR;
node->parent->RB_COLOR=BLACK;
brother->right->RB_COLOR=BLACK;
RotateLeft(node->parent);
node=m_root;
}
}
}
else
{
RB_NODE* brother=node->parent->left;
if (brother->RB_COLOR==RED)
{
brother->RB_COLOR=BLACK;
node->parent->RB_COLOR=RED;
RotateRight(node->parent);
brother=node->parent->left;
}
else
{
if (brother->right->RB_COLOR==BLACK&&brother->left->RB_COLOR==BLACK)
{
brother->RB_COLOR=RED;
node=node->parent;
}
else if (brother->left->RB_COLOR==BLACK)
{
brother->right->RB_COLOR=BLACK;
brother->RB_COLOR=RED;
RotateLeft(brother);
brother=node->parent->left;
}
else if (brother->left->RB_COLOR==RED)
{
brother->RB_COLOR=node->parent->RB_COLOR;
node->parent->RB_COLOR=BLACK;
brother->left->RB_COLOR=BLACK;
RotateRight(node->parent);
node=m_root;
}
}
}
}
m_nullNode->parent=m_root;
node->RB_COLOR=BLACK;
}
void PrintTree(ORDER_MODE eOrderMode)const
{
if (ORDER_MODE_PREV==eOrderMode)
printTreeInPrev(m_root);
else if (ORDER_MODE_MID==eOrderMode)
printTreeInMid(m_root);
else if (ORDER_MODE_POST==eOrderMode)
printTreeInPost(m_root);
else
;
}
void printTreeInPrev(RB_NODE*t) const
{
if (t!=m_nullNode)
{
cout<<t->key;
if (t->RB_COLOR==BLACK)
{
cout<<"B ";
}
else
cout<<"R ";
printTreeInPrev(t->left);
printTreeInPrev(t->right);
}
}
void printTreeInMid(RB_NODE*t) const
{
if (t!=m_nullNode)
{
printTreeInMid(t->left);
cout<<t->key;
if (t->RB_COLOR==BLACK)
{
cout<<"B ";
}
else
cout<<"R ";
printTreeInMid(t->right);
}
}
void printTreeInPost(RB_NODE*t) const
{
if (t!=m_nullNode)
{
printTreeInPost(t->left);
printTreeInPost(t->right);
cout<<t->key;
if (t->RB_COLOR==BLACK)
{
cout<<"B ";
}
else
cout<<"R ";
}
}
void clear(RB_NODE* node)
{
if (node==m_nullNode)
{
return;
}
else
{
clear(node->left);
clear(node->right);
delete node;
}
}
};
#endif _RB_TREE_H_
main.cpp:
#include "black_red_tree.h"
#include <vector>
using namespace std;
void main()
{
RB_Tree<int> tree;
int a[20]={4,19, 0 ,17 ,10 ,12 ,8 ,11, 18, 1 ,6, 16,7, 14 ,9 ,3 ,13, 2 ,5 ,15};
vector<int> v(a,a+20);
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<" ";
}
cout<<endl;
for (int i=0;i<v.size();i++)
{
tree.Insert(v[i]);
cout<<"insert: "<<v[i]<<endl;
tree.printTreeInMid(tree.m_root);
cout<<endl;
}
cout<<"root: "<<tree.m_root->key<<endl;
tree.printTreeInPrev(tree.m_root);
cout<<endl;
tree.printTreeInMid(tree.m_root);
cout<<endl;
tree.printTreeInPost(tree.m_root);
cout<<endl;
for (int i=0;i<v.size();i++)
{
cout<<"delete: "<<v[i]<<endl;
tree.Delete(v[i]);
tree.printTreeInMid(tree.m_root);
}
tree.clear(tree.m_root);
return;
}
运行部分结果如下: