#include <iostream>
#include <iomanip>
using namespace std;
#define RED 0
#define BLACK 1
template<class T>
class RbTreeNode
{
public:
unsigned int color;
T key;
RbTreeNode *left;
RbTreeNode *right;
RbTreeNode *parent;
RbTreeNode(const int &value = RED, T c = -1, RbTreeNode<T> *l = NULL, RbTreeNode<T> *r = NULL, RbTreeNode<T> *p = NULL):
color(value), key(c), left(l), right(r), parent(p){}
};
template<class T>
class RbTree
{
private:
RbTreeNode<T> *Root;
public:
RbTreeNode<T> *nil;
RbTree();
~RbTree();
void preOrder();
void inOrder();
void postOrder();
RbTreeNode<T>* ssearch(T key);
T minimum();
T maximum();
void iinsert(T key);
void ddelete(T key);
void destroy();
void print();
private:
void preOrder(RbTreeNode<T>* tree) const;
void inOrder(RbTreeNode<T>* tree) const;
void postOrder(RbTreeNode<T>* tree) const;
RbTreeNode<T>* ssearch(RbTreeNode<T>* x, T key) const;
RbTreeNode<T>* minimum(RbTreeNode<T>* x);
RbTreeNode<T>* maximum(RbTreeNode<T>* x);
RbTreeNode<T>* predecessor(RbTreeNode<T>* x);
RbTreeNode<T>* successor(RbTreeNode<T>* x);
void Left_rotation(RbTreeNode<T>* &root, RbTreeNode<T> *x);
void Right_rotation(RbTreeNode<T>* &root, RbTreeNode<T> *y);
void iinsert_fixup(RbTreeNode<T>* &root, RbTreeNode<T> *x);
void iinsert(RbTreeNode<T>* &r, RbTreeNode<T>* &x);
void delete_fixup(RbTreeNode<T>* &root, RbTreeNode<T> *x);
void Rb_transplant(RbTreeNode<T>* &root, RbTreeNode<T>* &u, RbTreeNode<T>* &v);
void ddelete(RbTreeNode<T>* &root, RbTreeNode<T> *x);
void destroy(RbTreeNode<T>* &tree);
void print(RbTreeNode<T>* tree, T key, int d);
};
template<class T>
RbTree<T>::RbTree()
{
nil = new RbTreeNode<T>(BLACK, -1, nil, nil, nil);
Root = nil;
}
template<class T>
RbTree<T>::~RbTree()
{
destroy(Root);
delete nil;
}
template<class T>
void RbTree<T>::preOrder(RbTreeNode<T>* tree) const
{
if(tree != nil)
{
cout << tree->key << " ";
preOrder(tree->left);
preOrder(tree->right);
}
}
template<class T>
void RbTree<T>::preOrder()
{
preOrder(Root);
}
template<class T>
void RbTree<T>::inOrder(RbTreeNode<T>* tree) const
{
if(tree != nil)
{
inOrder(tree->left);
cout << tree->key << " ";
inOrder(tree->right);
}
}
template<class T>
void RbTree<T>::inOrder()
{
inOrder(Root);
}
template<class T>
void RbTree<T>::postOrder(RbTreeNode<T>* tree) const
{
if(tree != nil)
{
postOrder(tree->left);
postOrder(tree->right);
cout << tree->key << " ";
}
}
template<class T>
void RbTree<T>::postOrder()
{
postOrder(Root);
}
template<class T>
RbTreeNode<T>* RbTree<T>::ssearch(RbTreeNode<T>* x, T key) const
{
if(x == nil || x->key == key)
{
return x;
}
if(key < x->key)
{
return ssearch(x->left, key);
}
else
{
return ssearch(x->right, key);
}
}
template<class T>
RbTreeNode<T>* RbTree<T>::ssearch(T key)
{
ssearch(Root, key);
}
template<class T>
RbTreeNode<T>* RbTree<T>::minimum(RbTreeNode<T>* tree)
{
if(tree == nil)
{
return nil;
}
while(tree->left != nil)
{
tree = tree->left;
}
return tree;
}
template<class T>
T RbTree<T>::minimum()
{
RbTreeNode<T>* p = minimum(Root);
if(p != nil)
{
return p->key;
}
return T(NULL);
}
template<class T>
RbTreeNode<T>* RbTree<T>::maximum(RbTreeNode<T>* tree)
{
if(tree == nil)
{
return nil;
}
while(tree->right != nil)
{
tree = tree->right;
}
return tree;
}
template<class T>
T RbTree<T>::maximum()
{
RbTreeNode<T>* p = maximum(Root);
if(p != nil)
{
return p->key;
}
return T(NULL);
}
template<class T>
RbTreeNode<T>* RbTree<T>::predecessor(RbTreeNode<T>* x)
{
if(x->left != nil)
{
return maximum(x->left);
}
RbTreeNode<T> *p = x->parent;
while(x != p->right && p)
{
x = p;
p = p->parent;
}
return p;
}
template<class T>
RbTreeNode<T>* RbTree<T>::successor(RbTreeNode<T>* x)
{
if(x->right != nil)
{
return minimum(x->right);
}
RbTreeNode<T> *p = x->parent;
if(p->left != x && p)
{
x = p;
p = p->parent;
}
return p;
}
template<class T>
void RbTree<T>::Left_rotation(RbTreeNode<T>* &root, RbTreeNode<T> *x)
{
RbTreeNode<T> *p = x->right;
x->right = p->left;
if(p->left != nil)
{
p->left->parent = x;
}
p->parent = x->parent;
if(x->parent == nil)
{
root = p;
}
else
{
if(x->parent->left == x)
{
x->parent->left = p;
}
else
{
x->parent->right = p;
}
}
x->parent = p;
p->left = x;
}
template<class T>
void RbTree<T>::Right_rotation(RbTreeNode<T>* &root, RbTreeNode<T> *y)
{
RbTreeNode<T> *p = y->left;
y->left = p->right;
if(p->right != nil)
{
p->right->parent = y;
}
p->parent = y->parent;
if(y->parent != nil)
{
if(y->parent->left = y)
{
y->parent->left = p;
}
else
{
y->parent->right = p;
}
}
else
{
root = p;
}
p->right = y;
y->parent = p;
}
template<class T>
void RbTree<T>::iinsert_fixup(RbTreeNode<T>* &root, RbTreeNode<T> *x)
{
RbTreeNode<T> *parent, *gparent;
while((parent = x->parent) && parent->color == RED)
{
gparent = parent->parent;
if(gparent->left == parent)
{
RbTreeNode<T> *uncle = gparent->right;
if(uncle && uncle->color == RED)
{
parent->color = BLACK;
uncle->color = BLACK;
gparent->color = RED;
x= gparent;
continue;
}
if(parent->right == x)
{
RbTreeNode<T> *t;
Left_rotation(root, parent);
t = parent;
parent = x;
x = t;
}
parent->color = BLACK;
gparent->color = RED;
Right_rotation(root,gparent);
}
else
{
RbTreeNode<T> *uncle = gparent->left;
if(uncle && uncle->color == RED)
{
parent->color = BLACK;
uncle->color = BLACK;
gparent->color = RED;
x = gparent;
continue;
}
if(x == parent->left)
{
RbTreeNode<T> *t;
Right_rotation(root,parent);
t= parent;
parent = x;
x = t;
}
parent->color = BLACK;
gparent->color = RED;
Left_rotation(root, gparent);
}
}
root->color = BLACK;
}
template<class T>
void RbTree<T>::iinsert(RbTreeNode<T>* &r, RbTreeNode<T>* &x)
{
RbTreeNode<T> *y = nil;
RbTreeNode<T> *z = r;
while(z != nil)
{
y = z;
if(x->key < z->key)
{
z = z->left;
}
else
{
z = z->right;
}
}
x->parent = y;
if(y == nil)
{
r = x;
}
else if(x->key < y->key)
{
y->left = x;
}
else
{
y->right = x;
}
x->left = nil;
x->right = nil;
iinsert_fixup(r, x);
}
template<class T>
void RbTree<T>::iinsert(T key)
{
RbTreeNode<T> *z = nil;
if((z = new RbTreeNode<T>(RED,key,nil, nil,nil)) == nil)
{
return;
}
iinsert(Root, z);
}
template<class T>
void RbTree<T>::delete_fixup(RbTreeNode<T>* &root, RbTreeNode<T> *x)
{
while(x != root && x->color == BLACK)
{
if(x == x->parent->left)
{
RbTreeNode<T> *brother = x->parent->right;
if(brother->color == RED)
{
brother->color = BLACK;
x->parent->color = RED;
Left_rotation(root, x->parent);
brother = x->parent->right;
}
if(brother->left->color == BLACK && brother->right->color == BLACK)
{
brother->color = RED;
x = x->parent;
}
else
{
if(brother->right->color == BLACK)
{
brother->color = RED;
brother->left->color = BLACK;
Right_rotation(root, brother);
brother = x->parent->right;
}
brother->color = x->parent->color;
x->parent->color = BLACK;
brother->right->color = BLACK;
Left_rotation(root, x->parent);
x = root;
}
}
else
{
RbTreeNode<T> *brother = x->parent->left;
if(brother->color == RED)
{
brother->color = BLACK;
x->parent->color = RED;
Right_rotation(root, x->parent);
brother = x->parent->left;
}
if(brother->left->color == BLACK && brother->right->color == BLACK)
{
brother->color = RED;
x = x->parent;
}
else
{
if(brother->left->color == BLACK)
{
brother->color = RED;
brother->right->color = BLACK;
Left_rotation(root, brother);
brother = x->parent->left;
}
brother->color = x->parent->color;
x->parent->color = BLACK;
brother->left->color = BLACK;
Right_rotation(root, x->parent);
x = root;
}
}
}
x->color = BLACK;
}
template<class T>
void RbTree<T>::Rb_transplant(RbTreeNode<T>* &root, RbTreeNode<T>* &u, RbTreeNode<T>* &v)
{
if(u->parent == nil)
{
root = v;
}
else if(u == u->parent->left)
{
u->parent->left = v;
}
else u->parent->right = v;
v->parent = u->parent;
}
template<class T>
void RbTree<T>::ddelete(RbTreeNode<T>* &root, RbTreeNode<T> *z)
{
RbTreeNode<T> *y = z;
RbTreeNode<T> *x = z;
int color = y->color;
if(z->left == nil)
{
x = z->right;
Rb_transplant(root, z, z->right);
}
else if(z->right == nil)
{
x = z->left;
Rb_transplant(root, z, z->left);
}
else
{
y = successor(z);
color = y->color;
x = y->right;
if(y->parent == z)
{
x->parent = y;
}
else
{
Rb_transplant(root, y, y->right);
y->right = z->right;
y->right->parent = y;
}
Rb_transplant(root, z, y);
y->left = z->left;
y->left->parent = y;
y->color = z->color;
}
if(color == BLACK)
{
delete_fixup(root, x);
}
}
template<class T>
void RbTree<T>::ddelete(T key)
{
RbTreeNode<T> *z = nil;
if((z = ssearch(key)) == nil)
{
return;
}
ddelete(Root, z);
}
template<class T>
void RbTree<T>::print(RbTreeNode<T>* tree, T key, int d)
{
if(tree != nil)
{
if(d == 0)
{
cout << setw(2) << tree->key << " is root";
if(tree->color == 0)
{
cout << "(RED" << ")" << endl;
}
else
{
cout << "(BLACK" << ")" << endl;
}
}
else
{
cout << setw(2) << tree->key << " is " << setw(2) << key << "'s" << setw(12) << (d == 1 ? "right child" : "left child");
if(tree->color == 0)
{
cout << "(RED" << ")" << endl;
}
else
{
cout << "(BLACK" << ")" << endl;
}
}
print(tree->left, tree->key, -1);
print(tree->right, tree->key, 1);
}
}
template<class T>
void RbTree<T>::print()
{
if(Root != nil)
{
print(Root, Root->key, 0);
}
}
template <class T>
void RbTree<T>::destroy(RbTreeNode<T>* &tree)
{
if (tree == nil)
{
return ;
}
if (tree->left != nil)
{
destroy(tree->left);
}
if (tree->right != nil)
{
destroy(tree->right);
}
delete tree;
}
template <class T>
void RbTree<T>::destroy()
{
destroy(Root);
}
int main()
{
int a, n;
RbTree<int>* tree = new RbTree<int>();
cout << "请输入结点个数:";
cin >> n;
cout << "请输入结点的键值:";
for(int i = 1; i <= n; i++)
{
cin >> a;
tree->iinsert(a);
}
cout << "\n前序遍历:";
tree->preOrder();
cout << "\n中序遍历:";
tree->inOrder();
cout << "\n后序遍历:";
tree->postOrder();
cout << endl;
cout << "最小值:" << tree->minimum() << endl;
cout << "最大值:" << tree->maximum() << endl;
cout << "整棵树:" << endl;
tree->print();
int x;
cout << "\n请输入要删除的结点的结点值:";
cin >> x;
tree->ddelete(x);
cout << "\n删除" << x << "结点后整棵树:";
tree->print();
tree->destroy();
return 0;
}