红黑树C/C++实现(附带一个set容器)

#include <stdio.h>
#include <string>
using namespace std;


static const bool RED=true;
static const bool BLACK=false;
//tree node
template <typename Type>
class TNode{
public:
	TNode* p;//parent
	TNode* left;// left son
	TNode* right;//right son
	Type key;
	bool color;
public:
	TNode();
	//~TNode();
	TNode(const Type& key);
	int compare(const Type& t);
};

template <typename Type>
TNode<Type>::TNode(){
	p=left=right=NULL;
}
template <typename Type>
TNode<Type>::TNode(const Type& key){
	this->key=key;
	p=left=right=NULL;
}

template <typename Type>
int TNode<Type>::compare(const Type& t){
	//return key>t?1:(key=t?0:-1);
	if(key>t)
		return 1;
	if(key<t)
		return -1;
	return 0;
}

// tree
template <typename Type>
class RBTree{
public:
	TNode<Type>* root;
	TNode<Type>* nil;
public:
	RBTree();
	~RBTree();
	TNode<Type>* rb_search(const Type& key);
	void rb_insert(TNode<Type>* tnode);
	TNode<Type>* rb_delete(TNode<Type>* tnode);
	void inorder(TNode<Type>* node,Type a[]);
private:
	TNode<Type>* min(TNode<Type>* x);
	TNode<Type>* max(TNode<Type>* x);
	TNode<Type>* successor(TNode<Type>* x);
	void left_rotate(TNode<Type>* x);
	void right_rotate(TNode<Type>* x);
	void rb_insert_fixup(TNode<Type>* z);
	void rb_delete_fixup(TNode<Type>* z);
	void freeTree(TNode<Type>* node);
};
template <typename Type>
RBTree<Type>::RBTree(){
	root=nil=new TNode<Type>();
	nil->color=BLACK;
	//root=nil;
}
template <typename Type>
RBTree<Type>::~RBTree(){
	freeTree(root);
	if(nil!=NULL){
		delete nil;
		nil=NULL;
	}
}
template <typename Type>
TNode<Type>* RBTree<Type>::min(TNode<Type>* x){
	while(x->left!=nil){
		x=x->left;
	}
	return x;
}
template <typename Type>
TNode<Type>* RBTree<Type>::max(TNode<Type>* x){
	while(x->right!=nil){
		x=x->right;
	}
	return x;
}
template <typename Type>
TNode<Type>* RBTree<Type>::successor(TNode<Type>* x){
	if(x->right!=nil){
		return min(x);
	}
	TNode<Type>* y=x->p;
	while(y!=nil && x==y->right){
		x=y;
		y=y->p;
	}
	return y;
}
template <typename Type>
TNode<Type>* RBTree<Type>::rb_search(const Type& key){
	TNode<Type>* p=root;
	while(p!=nil){
		int result=p->compare(key);
		if(result==0){
			return p;
		}else if(result==1){
			p=p->left;
		}else{
			p=p->right;
		}
	}
	return p;
}
template <typename Type>
void RBTree<Type>::rb_insert(TNode<Type>* tnode){
	TNode<Type>* x=root;
	TNode<Type>* y=nil;
	while(x!=nil){
		y=x;
		if(x->compare(tnode->key)==1){
			x=x->left;
		}else{
			x=x->right;
		}
	}
	tnode->p=y;
	if(y==nil){
		root=tnode;
	}else if(y->compare(tnode->key)==1){
		y->left=tnode;
	}else{ 
		y->right=tnode;
	}
	tnode->left=nil;
	tnode->right=nil;
	tnode->color=RED;
	rb_insert_fixup(tnode);
}
template <typename Type>
void RBTree<Type>::left_rotate(TNode<Type>* x){
	TNode<Type>* y=x->right;
	x->right=y->left;
	if(y->left!=nil){
		y->left->p=x;
	}
	y->p=x->p;
	if(x->p==nil){
		root=y;
	}else{
		if(x->p->left==x){
			x->p->left=y;
		}else{
			x->p->right=y;
		}
	}
	y->left=x;
	x->p=y;
}
template <typename Type>
void RBTree<Type>::right_rotate(TNode<Type>* x){
	TNode<Type>* y=x->left;
	x->left=y->right;
	if(y->right!=nil){
		y->right->p=x;
	}
	y->p=x->p;
	if(y->p==nil){
		root=y;
	}else{
		if(x->p->left=x){
			x->p->left=y;
		}else{
			x->p->right=y;
		}
	}
	y->right=x;
	x->p=y;
}
template <typename Type>
void RBTree<Type>::rb_insert_fixup(TNode<Type>* z){
	while(z->p->color==RED){
		if(z->p==z->p->p->left){
			TNode<Type>* y=z->p->p->right;
			if(y->color==RED){//z的叔叔是红色
				z->p->color=BLACK;
				z->p->p->color=RED;
				y->color=BLACK;
				z=z->p->p;
			}else if(z==z->p->right){//z的叔叔是黑色,z是右孩子
				z=z->p;
				left_rotate(z);
			}else{//z的叔叔是黑色,z是左孩子
				z->p->color=BLACK;
				z->p->p->color=RED;
				right_rotate(z->p->p);
			}
		}else{
			TNode<Type>* y=z->p->p->left;
			if(y->color==RED){
				z->p->color=BLACK;
				z->p->p->color=RED;
				y->color=BLACK;
				z=z->p->p;
			}else if(z==z->p->left){
				z=z->p;
				right_rotate(z);
			}else{
				z->p->color=BLACK;
				z->p->p->color=RED;
				left_rotate(z->p->p);
			}
		}
	}
	root->color=BLACK;
}

template <typename Type>
TNode<Type>* RBTree<Type>::rb_delete(TNode<Type>* tnode){
	TNode<Type>* y;
	if(tnode->left==nil || tnode->right==nil){
		y=tnode;
	}else{
		y=successor(tnode);
	}
	TNode<Type>* x;
	if(y->left!=nil){
		x=y->left;
	}else{
		x=y->right;
	}
	x->p=y->p;
	if(y->p==nil){
		root=x;
	}else{
		if(y->p->left==y){
			y->p->left=x;
		}else{
			y->p->right=x;
		}
	}
	if(y!=tnode){
		tnode->key=y->key;
	}
	if(y->color==BLACK){
		rb_delete_fixup(x);
	}

	return y;
}

template <typename Type>
void RBTree<Type>::rb_delete_fixup(TNode<Type>* z){
	//z的兄弟
	TNode<Type>* w;
	while(z!=root && z->color==BLACK){
		if(z==z->p->left){
			w=z->p->right;
			if(w->color==RED){//z的兄弟w是红色
				w->color=BLACK;
				z->p->color=RED;
				left_rotate(z->p);
				w=z->p->right;
			}
			if(w->left->color==BLACK && w->right->color==BLACK){//z的兄弟w是黑色,w的两个孩子都是黑色
				w->color=RED;
				z=z->p;
			}else if(w->right->color==BLACK){//z的兄弟w是黑色,w的左孩子是红色,右孩子是黑色
				w->left->color=BLACK;
				w->color=RED;
				right_rotate(w);
				w=z->p->right;
			}else{//z的兄弟w是黑色,w的右孩子是红色
				w->color=z->p->color;
				z->p->color=BLACK;
				w->right->color=BLACK;
				left_rotate(z->p);
				z=root;
			}
		}else{
			w=z->p->left;
			if(w->color==RED){
				w->color=BLACK;
				z->p->color=RED;
				right_rotate(z->p);
				w=z->p->left;
			}
			if(w->left->color==BLACK && w->right->color==BLACK){
				w->color=RED;
				z=z->p;
			}else if(w->left->color==BLACK){
				w->right->color=BLACK;
				w->color=RED;
				left_rotate(w);
				w=z->p->left;
			}else{
				w->color=z->p->color;
				z->p->color=BLACK;
				w->left->color=BLACK;
				right_rotate(z->p);
				z=root;
			}
		}
	}
	z->color=BLACK;
}

template <typename Type>
void RBTree<Type>::freeTree(TNode<Type>* node){
	if(node==nil){
		return;
	}
	if(node->left!=nil){
		freeTree(node->left);
	}
	if(node->right!=nil){
		freeTree(node->right);
	}
	delete node;
	node=NULL;
}
template <typename Type>
void RBTree<Type>::inorder(TNode<Type>* node,Type a[]){
	static int count=0;
	if(node==nil){
		return;
	}
	inorder(node->left,a);
	a[count++]=node->key;
	inorder(node->right,a);
}
//*************MySet**************************//
template <typename Type>
class MySet{
	RBTree<Type>* tree;
	int count;
public:
	MySet();
	~MySet();
	bool add(const Type& key);
	bool contains(const Type& key);
	bool remove(const Type& key);
	bool isEmpty();
	int  size();
	void clear();
	Type* toArray(int& i);
};
template <typename Type>
MySet<Type>::MySet(){
	tree=new RBTree<Type>();
	count=0;
}
template <typename Type>
MySet<Type>::~MySet(){
	if(tree!=NULL){
		delete tree;
		tree=NULL;
	}
}
template <typename Type>
bool MySet<Type>::contains(const Type& key){
	TNode<Type>* node=tree->rb_search(key);
	if(node==tree->nil){
		return false;
	}
	return true;
}
template <typename Type>
bool MySet<Type>::add(const Type& key){
	if(contains(key)){
		return false;
	}
	TNode<Type>* node=new TNode<Type>(key);
	tree->rb_insert(node);
	count++;
	return true;
}
template <typename Type>
bool MySet<Type>::remove(const Type& key){
	TNode<Type>* node=tree->rb_search(key);
	if(node==tree->nil){
		return false;
	}
	TNode<Type>* result=tree->rb_delete(node);
	delete result;
	count--;
	return true;
}
template <typename Type>
bool MySet<Type>::isEmpty(){
	return count==0?true:false;
}
template <typename Type>
int MySet<Type>::size(){
	return count;
}
template <typename Type>
void MySet<Type>::clear(){
	if(tree!=NULL){
		delete tree;
		tree=NULL;
	}
	tree=new RBTree<Type>();
	count=0;
}
template <typename Type>
Type* MySet<Type>::toArray(int& i){
	Type* a=new Type[count];
	tree->inorder(tree->root,a);
	i=count;
	return a;
}

#if 0
void main(){
	MySet<int>* set=new MySet<int>();
	for(int i=1000;i>0;i--){
		set->add(i);
	}
	printf("倒序插入1000个数之后\n");
	int count=0;
	int* a=set->toArray(count);
	printf("遍历较小的十个数:\n");
	for(int i=0;i<10;i++){
		printf("%d\t",a[i]);
	}
	printf("\n");
	
	set->remove(1);
	printf("after remove 1.set.size()=%d\n",set->size());

	set->clear();
	printf("after clear.set.size()=%d\n",set->size());
	delete set;

	getchar();

}

#endif

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值