二叉树 - 红黑树

RBTree.h

#include <iostream>

template <typename T>
class RBTree
{
public:
	RBTree();
	bool insert(const T&);
	bool del(const T&);
	void show() { 
		Mid_Order(root);
	}
	
private:
	
	enum { RED, BLACK };
	
typedef struct _node
	{
		bool color;
		T data;
		struct _node * p, *left, *right;
	}Node;

	Node *root;
	Node *nil;
	unsigned int Size;
	
	void RB_Ins_Fix(Node *);
	void RB_Del_Fix(Node *);
	void Left_Rotate(Node *);
	void Right_Rotate(Node *);

	void Replace(Node *, Node *);
	void Mid_Order(const Node *);
};

template <typename T>
RBTree<T>::RBTree()
{
	Node *p = new Node;
	Size = 0;
	nil = new Node;
	nil->color = BLACK;
	nil->p = nil->left = nil->right = NULL;
	root = nil;
}

template <typename T>
bool RBTree<T>::insert(const T& val)
{
	Node *pf = nil;
	Node *pc = root;
	while (pc != nil)
	{
		pf = pc;
		if (val >= pc->data)
			pc = pc->right;
		else
			pc = pc->left;
	}
	Node *pn = new Node;
	pn->data = val;
	pn->p = pf;
	pn->left = pn->right = nil;
	pn->color = RED;
	if (pf == nil)
	{
		pn->color = BLACK;
		root = pn;
		return true;
	}
	else
	{
		if (val >= pf->data)
			pf->right = pn;
		else
			pf->left = pn;
	}
	RB_Ins_Fix(pn);
	return true;
}

template <typename T>
void RBTree<T>::RB_Ins_Fix(Node * ps)
{
	while (ps->p->color == RED)
	{
		Node * pb;
		if (ps->p == nil)
			return;
		
		if (ps->p == ps->p->p->left)
			pb = ps->p->p->right;
		else
			pb = ps->p->p->left;
		if (pb->color == RED)
		{
			pb->color = BLACK;
			ps->p->color = BLACK;
			ps->p->p->color = RED;
			ps = ps->p->p;
		}
		else
		{
			if (ps == ps->p->right && ps->p == ps->p->p->left)
			{
				Left_Rotate(ps->p);
				ps = ps->left;
			}
			else if (ps == ps->p->left && ps->p == ps->p->p->right)
			{
				Right_Rotate(ps->p);
				ps = ps->right;
			}
			ps->p->color = BLACK;
			ps->p->p->color = RED;
			if (ps == ps->p->right && ps->p == ps->p->p->right)
				Left_Rotate(ps->p->p);
			else
				Right_Rotate(ps->p->p);
		}
	}
	root->color = BLACK;
	
}

template <typename T>
void RBTree<T>::Left_Rotate(Node * pf)
{
	Node * pc = pf->right;
	pc->p = pf->p;
	if (pf->p != nil)
	{
		if (pf == pf->p->left)
			pf->p->left = pc;
		else
			pf->p->right = pc;
	}
	pf->right = pc->left;
	if (pf == root)
		root = pc;
	if (pc->left != nil)
		pc->left->p = pf;
	pc->left = pf;
	pf->p = pc;
}

template <typename T>
void RBTree<T>::Right_Rotate(Node * pf)
{
	Node * pc = pf->left;
	pc->p = pf->p;
	if (pf->p != nil)
	{
		if (pf == pf->p->left)
			pf->p->left = pc;
		else
			pf->p->right = pc;
	}
	pf->left = pc->right;
	if (pf == root)
		root = pc;
	if (pc->right != nil)
		pc->right->p = pf;
	pc->right = pf;
	pf->p = pc;
}


template <typename T>
void RBTree<T>::Mid_Order(const Node *p)
{
	if (p != nil)
	{
		Mid_Order(p->left);
		std::cout << "结点" << p->data << " " << ((p->color) ? "黑" : "红") << endl;
		Mid_Order(p->right);
	}
}


template <typename T>
bool RBTree<T>::del(const T& val)
{	
	Node *pc = nil;
	Node *pn = root;
	while (pn != nil && pc->data != val)
	{
		pc = pn;
		if (val >= pn->data)
			pn = pn->right;
		else
			pn = pn->left;
	}
	if (pc == nil || pc->data != val)
		return false;

	if (pc->color == RED)
	{
		if (pc == pc->p->left)
			pc->p->left = nil;
		else
			pc->p->right = nil;
		delete pc;
	}
	else
	{
		Node *pt = pc; //寻找右侧结点
		if (pt->right != nil)
			while (pt->left != nil)
				pt = pt->left;
		if (pt != pc)
			Replace(pt, pc); //交换结点,转换为删除单子树结点问题

		pc = pt;
		pt = pt->right;
		pc->p->left = pt;
		pt->p = pc->p;
		if (pc == root)
			root = pt;
		delete pc;
		RB_Del_Fix(pt);
	}
	return true;
}

template <typename T>
void RBTree<T>::RB_Del_Fix(Node *x)
{
	while (x != root && x->color == BLACK)
	{
		Node *w;
		if (x == x->p->left)
		{
			w = x->p->right;
			if (w->color == RED)
			{
				w->color = BLACK;
				w->p->color = RED;
				Left_Rotate(w->p);
				w = x->p->right;
			}
		}
		else
		{
			w = x->p->left;
			if (w->color == RED)
			{
				w->color = BLACK;
				w->p->color = RED;
				Right_Rotate(w->p);
				w = x->p->left;
			}
		}
		if (w->left->color == BLACK && w->right->color == BLACK)
		{
			w->color = RED;
			x = x->p;
		}
		else
		{
			if (w->left->color == RED)
			{
				w->left->color = BLACK;
				w->color = RED;
				Right_Rotate(w);
				w = w->p;
			}
			w->color = w->p->color;
			w->p->color = BLACK;
			w->right->color = BLACK;
			Left_Rotate(w->p);
			x = root; //已经平衡,退出
		}
	}
	x->color = BLACK;
}

template <typename T>
void RBTree<T>::Replace(Node *x, Node *y)
{
	/*
	Node *tmp;

	if (x == x->p->left)
		x->p->left = y;
	else
		x->p->right = y;
	if (y == y->p->left)
		y->p->left = x;
	else
		y->p->right = x;

	tmp = x->p;
	x->p = y->p;
	y->p = tmp; 

	tmp = x->left;
	x->left = y->left;
	y->left = tmp;

	tmp = x->right;
	x->right = y->right;
	y->right = tmp;

	if (x->color != y->color)
	{
		if (x->color == RED)
		{
			x->color = BLACK;
			y->color = RED;
		}
		else
		{
			x->color = RED;
			y->color = BLACK;
		}
	}
	*/
	T t = x->data;
	x->data = y->data;
	y->data = t;
}


main.cpp

#include <iostream>
#include "RBTree.h"
using namespace std;
int main()
{     
	RBTree<int> a;
	for (int i = 0; i < 10; ++i)
	{	
		a.insert(i);
		a.show();
		cout << endl;
	}
		
	for (int i = 0; i < 10; ++i)
	{
		a.del(i);
		a.show();
		cout << endl;
	}

	cout << endl;
	cout << "ok\n";
	cin.get();
	cin.get();
	return 0;
}


转载于:https://www.cnblogs.com/xyyh/p/3980306.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值