c++实现红黑树

红黑树不止5个性质

因为插入时默认红色节点插入导致了其他性质

黑单黑没有

红单黑没有

左旋右旋要选定旋点

代码重复严重

#ifndef     _TREE_
#define   _TREE_
#include<string>
#include<vector>
using std::string;
using std::vector;
template<class T>
class Node {
public:
	Node():color("RED"),value(0),left(NULL),right(NULL),parent(NULL){}
	Node(T val):color("RED"),value(val),left(NULL),right(NULL),parent(NULL){}
	~Node()
	{

	}
	string color;
	T value;
	Node<T>* left;
	Node<T>* right;
	Node<T>* parent;
};

template<class T>
class BrTree {
public:
	BrTree():root(NULL){}
	BrTree(const vector<T>& vec);
	void LeftRotate(Node<T>* node);
	void RightRotate(Node<T>* node);
	void Insert(T key);
	void Delete(T key);
	Node<T>* Find(T value);
	void RbTransplant(Node<T>* node, Node<T>* stepson);
	void InsertFixup(Node<T>* node);
	Node<T>* GetRoot()const;
	Node<T>* Min(Node<T>* root)const;
	void Prevprint(Node<T>* root)const;
private:
	Node<T>* root;

};
 template<class T>
 void  BrTree<T>::LeftRotate(Node<T>* node) {
	 Node<T>* nodeR = node->right;
	 if (nodeR != NULL) {
		 if (nodeR->left == NULL) {
			 node->right = NULL;
			 nodeR->left = node;
			 if (node->parent == NULL) {
				 root = nodeR;
				 nodeR->parent = NULL;
				 node->parent = nodeR;
				 return;
			 }
			 if (node->parent != NULL) {
				 if (node == node->parent->left) {
					 nodeR->parent = node->parent;
					 node->parent->left = nodeR;
					 node->parent = nodeR;
					 return;
				 }
				 if (node == node->parent->right) {
					 nodeR->parent = node->parent;
					 node->parent->right = nodeR;
					 node->parent = nodeR;
					 return;
				 }
			 }
		 }
		 if (nodeR->left != NULL) {
			 node->right = nodeR->left;
			 nodeR->left->parent = node;
			 nodeR->left = node;
			 if (node->parent == NULL) {
				 root = nodeR;
				 nodeR->parent = NULL;
				 node->parent = nodeR;
				 return;
			 }
			 if (node->parent != NULL) {
				 if (node == node->parent->left) {
					 nodeR->parent = node->parent;
					 node->parent->left = nodeR;
					 node->parent = nodeR;
					 return;
				 }
				 if (node == node->parent->right) {
					 nodeR->parent = node->parent;
					 node->parent->right = nodeR;
					 node->parent = nodeR;
					 return;
				 }
			 }
		 }
	 }
 }
 template<class T>
 void BrTree<T>::RightRotate(Node<T>* node) {
	 Node<T>*  nodeL = node->left;
	 if (nodeL != NULL) {
		 if (nodeL->right == NULL) {
			 node->left = NULL;
			 nodeL->right = node;
			 if (node->parent == NULL) {
				 root = nodeL;
				 nodeL->parent = NULL;
				 node->parent = nodeL;
				 return;
			 }
			 if (node->parent != NULL) {
				 if (node == node->parent->left) {
					 node->parent->left = nodeL;
					 nodeL->parent = node->parent;
					 node->parent = nodeL;
					 return;
				 }
				 if (node == node->parent->right) {
					 node->parent->right = nodeL;
					 nodeL->parent = node->parent;
					 node->parent = nodeL;
					 return;
				 }
			 }
		 }
		 if (nodeL->right != NULL) {
			 node->left = nodeL->right;
			 nodeL->right->parent = node;
			 nodeL->right = node;
			 if (node->parent == NULL) {
				 root = nodeL;
				 nodeL->parent = NULL;
				 node->parent = nodeL;
				 return;
			 }
			 if (node->parent != NULL) {
				 if (node->parent->left == node) {
					 nodeL->parent = node->parent;
					 node->parent->left = nodeL;
					 node->parent = nodeL;
					 return;
				 }
				 if (node->parent->right == node) {
					 nodeL->parent = node->parent;
					 node->parent->right = nodeL;
					 node->parent = nodeL;
					 return;
				 }
			 }
		 }
	 }
 }
 template<class T>
 void BrTree<T>::Insert(T key) {
	 Node<T>* cur = root;
	 Node<T>* cur1 = root;
	 Node<T>* cur2 = new Node<T>(key);
	 while (cur != NULL) {
		 if (cur->value >= key) {
			 cur1 = cur;
			 cur = cur->left;
		 }
		 else {
			 cur1 = cur;
			 cur = cur->right;
		 }
	 }
	/* if (cur1 == NULL) {
		 root = cur2;
		 cur2->color = "BLACK";
	 }*/
	 if (cur1->value >= key) {
		 cur1->left = cur2;
		 cur2->parent = cur1;
	 }
	 else {
		 cur1->right = cur2;
		 cur2->parent = cur1;
	 }
	 InsertFixup(cur2);
 }
 template<class T>
 void BrTree<T>::InsertFixup(Node<T>* node) {
	 Node<T>* pos = node;
	 while (pos->parent!=NULL&&pos->parent->color== "RED") {
		 if (pos->parent == pos->parent->parent->left) {
			 if (pos->parent->parent->right != NULL) {
				 if (pos->parent->parent->right->color == "RED") {
					 pos->parent->parent->color = "RED";
					 pos->parent->color = "BLACK";
					 pos->parent->parent->right->color = "BLACK";
					 pos = pos->parent->parent;
					 continue;
				 }
				 if (pos->parent->parent->right->color == "BLACK") {
					 if (pos == pos->parent->right) {
						 LeftRotate(pos->parent);
						 RightRotate(pos->parent);
						 pos->color = "BLACK";
						 pos->right->color = "RED";
						 break;
					 }
					 if (pos == pos->parent->left) {
						 RightRotate(pos->parent->parent);
						 pos->parent->color = "BLACK";
						 pos->parent->right->color = "RED";
						 break;
					 }
				 }
			 }
			 if (pos->parent->parent->right == NULL) {
				 if (pos == pos->parent->right) {
					 LeftRotate(pos->parent);
					 RightRotate(pos->parent);
					 pos->color = "BLACK";
					 pos->right->color = "RED";
					 break;
				 }
				 if (pos == pos->parent->left) {
					 RightRotate(pos->parent->parent);
					 pos->parent->color = "BLACK";
					 pos->parent->right->color = "RED";
					 break;
				 }
			 }
		 }
		 if (pos->parent == pos->parent->parent->right) {
			 if (pos->parent->parent->left != NULL) {
				 if (pos->parent->parent->left->color == "RED") {
					 pos->parent->color = "BLACK";
					 if(pos->parent->parent->parent!=NULL)
						 pos->parent->parent->color = "RED";
					 pos->parent->parent->left->color = "BLACK";
					 pos = pos->parent->parent;
					 continue;
				 }
				 if (pos->parent->parent->left->color == "BLACK") {
					 if (pos == pos->parent->left) {
						RightRotate(pos->parent);
						LeftRotate(pos->parent);
						pos->color = "BLACK";
						pos->left->color = "RED";
						break;
					 }
					 if (pos == pos->parent->right) {
						 LeftRotate(pos->parent->parent);
						 pos->parent->color = "BLACK";
						 pos->parent->left->color = "RED";
						 break;
					 }
				 }
			 }
			 if (pos->parent->parent->left == NULL) {
				 if (pos == pos->parent->left) {
					 RightRotate(pos->parent);
					 LeftRotate(pos->parent);
					 pos->color = "BLACK";
					 pos->left->color = "RED";
					 break;
				 }
				 if (pos == pos->parent->right) {
					 LeftRotate(pos->parent->parent);
					 pos->parent->color = "BLACK";
					 pos->parent->left->color = "RED";
					 break;
				 }
			 }
		 }
	 }
 }
template<class T>
BrTree<T>::BrTree(const vector<T>& vec) {
	root = new Node<T>(vec[0]);
	root->color = "BLACK";
	for (int i = 1; i < vec.size(); i++) {
		Insert(vec[i]);
	}
}
template<class T>
Node<T>* BrTree<T>::GetRoot()const {
	return this->root;
}
template<class T>
void BrTree<T>::Prevprint(Node<T>* root)const {
	if (root != NULL) {
		cout << root->value << root->color << "   ";
		Prevprint(root->left);
		Prevprint(root->right);
	}
}
template<class T>
Node<T>* BrTree<T>::Find(T value) {
	Node<T>* cur = root;
	while (cur != NULL) {
		if (cur->value > value)
			cur = cur->left;
		else if (cur->value < value)
			cur = cur->right;
		else
			return cur;
	}
}
template<class T>
void BrTree<T>::RbTransplant(Node<T>* node, Node<T>* stepson) {
	if (node->parent == NULL)
		root = stepson;
	else if (node == node->parent->left) {
		node->parent->left = stepson;
		stepson->parent = node->parent;
	}
	else{
		node->parent->right = stepson;
		stepson->parent = node->parent;
	}
}
template<class T>
void BrTree<T>::Delete(T key) {
	Node<T>* pos = Find(key);
	if (pos->left != NULL&&pos->right != NULL) {
		Node<T>* min = Min(pos->right);
		pos->value = min->value;
		pos = min;
	}
	if (pos->right != NULL&&pos->left == NULL) {
		pos->right->parent = pos->parent;
		pos->parent->left = pos->right;
		delete pos;
		return;
	}
	if (pos->left != NULL&&pos->right == NULL) {
		pos->left->parent = pos->parent;
		pos->parent->right = pos->left;
		delete pos;
		return;
	}
	if (pos->left == NULL&&pos->right == NULL) {
		if (pos->color == "RED") {
			if (pos == pos->parent->left) {
				pos->parent->left = NULL;
				delete pos;
				return;
			}
			if (pos == pos->parent->right) {
				pos->parent->right = NULL;
				delete pos;
				return;
			}
		}
		else {
			if (pos == pos->parent->left) {
				if (pos->parent->right == "RED") {
					pos->parent->color = "RED";
					pos->parent->right->color = "BLACK";
					LeftRotate(pos->parent);
				}
				if (pos->parent->right->right != NULL&&pos->parent->right->right->color == "RED") {
					string color1 = pos->parent->color;
					pos->parent->color = "BLACK";
					pos->parent->right->color = color1;
					LeftRotate(pos->parent);
					pos->parent->parent->right->color = "BLACK";
					delete pos;
					return;
				}
				if (pos->parent->right->left != NULL&&pos->parent->right->left->color == "RED") {

				}
				//父红 子黑无孙
				//父黑子黑无孙 循环
			}
		}

	}
}
template<class T>
Node<T>* BrTree<T>::Min(Node<T>* root)const {
	while (root->left != NULL) {
		root=root->left
	}
}
#endif // !_TREE_

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值