红黑树不止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_