学习红黑树
来源:互联网 发布:kali linux webcrack 编辑:程序博客网 时间:2024/06/10 08:26
#ifndef RB_TREE_H
#define RB_TREE_H
#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
using namespace std;
template<class KEY ,class U>
class RB_Tree
{
private:
RB_Tree(const RB_Tree& input){}
const RB_Tree& operator=(const RB_Tree& input){}
private:
enum COLOR{RED,BLACK};
class RB_Node
{
public:
RB_Node():left(NULL),right(NULL),parent(NULL){}
COLOR RB_COLOR;
RB_Node*left;
RB_Node*right;
RB_Node*parent;
KEY key;
U date;
};
public:
RB_Tree():m_nullNode(new RB_Node),m_root(m_nullNode){}
bool Empty()const
{
if(m_root==m_nullNode)
{
return true;
}
else
{
return false;
}
}
RB_Node*find(KEY key)
{
RB_Node* index = m_root;
while(index != m_nullNode)
{
if (key<index->key)
{
index=index->left;
}
else if(key>index->key)
{
index=index->right;
}
else
{
break;
}
}
return index;
}
//--------------------//插入结点的总操作//------------------------
//全部的工作,都在下述伪代码中:///
/*TREE-INSERT(T,z)
1 y=T.nil
2 x=T.root
3 while x≠T.nil
4 y=x
5 if z.key<x.key
6 x=x.left
7 else x=x.right
8 z.p=y
9 if y==T.nil
10 T.root=z //tree Twas empty
11 else if z.key<y.key
12 y.left =z
13 else y.right=z
14 z.left=T.nil
15 z.right =T.nil
16 z.color=RED
17 RB-INSERT-PIXUP(T.z)
*/
//因为将z着为红色,可能会违反某一红黑性质。
//所以需要下面的RB-INSERT-PIXUP(T.z)来保持红黑性质。
bool Insert(KEY key, U date)
{
RB_Node *insert_point =m_nullNode;
RB_Node *index=m_root;
while(index!=m_nullNode)
{
insert_point=m_root;
if (key<index->key)
{
index=index->left;
}
else if(key>index->key)
{
index=index->right;
}
else
{
return false;
}
}
RB_Node* insert_node=new RB_Node();
insert_node->key=key;
insert_node->date=date;
insert_node->RB_COLOR=RED;
insert_node->right=m_nullNode;
insert_node->left=m_nullNode;
if (insert_point==m_nullNode)
{
m_root=insert_node;
m_root->parent=m_nullNode;
m_nullNode->right=m_root;
m_nullNode->left=m_root;
m_nullNode->parent=m_root;
}
else
{
if(key<insert_point->key)
{
insert_point->left=insert_node;
}
else
{
insert_point->right=insert_node;
}
insert_node->parent=insert_point;
}
InsertFixup(insert_node);
}
//---------------------//插入结点性质修复//--------------------------------
//3种插入情况,都在下面的伪代码中(未涉及到所有全部的插入情况)。
/* RB-INSERT-FIXUP(T, z)
1 while z.p.color==RED
2 if z.p==z.p.p.left
3 y=z.p.p.right
4 if y.color==RED
5 z.p.color=BLACK // case 1
6 y.color=BLACK // case 1
7 z.p.p.color=RED // case 1
8 z=z.p.p // case 1
9 else if z==z.p.right
10 z=z.p // case 2
11 LEFT_ROTATE(T,z) // case 2
12 z.p.color=BLACK // case 3
13 z.p.p.color=RED // case 3
14 RIGHT-ROTATE(T,z.p.p) // case 3
15 else(same as then clause
with "right" and"left" exchanged)
16 T.root.color=BLACK
*/
void InsertFixup(RB_Node* node)
{
while(node->parent->RB_COLOR=RED)
{
if (node->parent==node->parent->parent->left)
{
RB_Node* uncle=node->parent->parent->right;
if (uncle->RB_COLOR==RED)//插入情况1,z的叔叔y是红色的。
{
node->parent->RB_COLOR=BLACK;
uncle->RB_COLOR=BLACK;
node->parent->parent->RB_COLOR=RED;
node=node->parent->parent;
}
else if (uncle->RB_COLOR==BLACK) //插入情况2:z的叔叔y是黑色的,。
{
if (node==node->parent->right)
{
node=node->parent;
RotateLeft(node);
}
else//插入情况3:z的叔叔y是黑色的,但z是左孩子。
{
node->parent->RB_COLOR = BLACK;
node->parent->parent->RB_COLOR = RED;
RotateRight(node->parent->parent);
}
}
}
else //这部分是针对为插入情况1中,z的父亲现在作为祖父的右孩子了的情况,而写的。
//15 else (same as then clause with "right" and "left" exchanged)
{
RB_Node* uncle = node->parent->parent->left;
if(uncle->RB_COLOR == RED)
{
node->parent->RB_COLOR = BLACK;
uncle->RB_COLOR = BLACK;
uncle->parent->RB_COLOR = RED;
node = node->parent->parent;
}
else if(uncle->RB_COLOR == BLACK)
{
if(node == node->parent->left)
{
node = node->parent;
RotateRight(node); //与上述代码相比,左旋改为右旋 ;
}
else
{
node->parent->RB_COLOR = BLACK;
node->parent->parent->RB_COLOR = RED;
RotateLeft(node->parent->parent); //右旋改为左旋,即可。
}
}
}
}
m_root->RB_COLOR = BLACK;
}
//////左旋////////////
/*LEFT-ROTATE(T,x)
1 y=x.right
2 x.right=y.left
3 if y.left≠T.nil
4 y.left.p=x
5 y.p=x.p
6 if x.p==T.nil
7 T.root=y
8 else if x==x.p.left
9 x.p.left=y
10 else x.p.right=y
11 y.left=x
12 x.p=y
*/
//左旋代码实现 ;
bool RotateLeft(RB_Node *node)
{
if(node==m_nullNode||node->right==m_nullNode)
{
return false;//can't rotate
}
RB_Node*lower_right=node->right;
lower_right->parent=node->parent;
node->right=lower_right->left;
if (lower_right->left!=m_nullNode)
{
lower_right->left->parent=node;
}
if (node->parent==m_nullNode)
{
m_root=lower_right;
m_nullNode->left=m_root;
m_nullNode->right=m_root;
}
else
{
if ( node==node->parent->left)
{
node->parent->left=lower_right;
}
else
{
node->parent->right=lower_right;
}
}
node->parent=lower_right;
lower_right->left=node;
}
//////右旋////
/*RIGHT-ROTATE(T,y)
1x=y.left
2y.left=x.right
3 if x.right≠T.nil
4 x.right.p=x
5 x.p=y.p
6 if y.p==T.nil
7 T.root=x
8 else if y==y.p.left
9 y.p.left=x
10 else y.p.right=x
11 x.p.right=y
12 y.p=x
*/
//右旋代码实现 //
bool RotateRight(RB_Node *node)
{
if(node==m_nullNode||node->left==m_nullNode)
{
return false;//can't rotate
}
RB_Node*lower_left=node->left;
node->left=lower_left->right;
lower_left->parent=node->parent;
if (lower_left->right!=m_nullNode)
{
lower_left->right->parent=node;
}
if (node->parent==m_nullNode)
{
m_root=lower_left;
m_nullNode->left=m_root;
m_nullNode->right=m_root;
}
else
{
if ( node==node->parent->right)
{
node->parent->right=lower_left;
}
else
{
node->parent->left=lower_left;
}
}
node->parent=lower_left;
lower_left->right=node;
}
//--------------------------删除结点总操作--------------------------------
/*RB-DEKETE(T,z)
1 y=z
2 y-original-color=y.color
3 if x.left==T.nil
4 x=z.right
5 RB-TRANSPLANT(T,z,z.right)
6 else if z.right==T.nil
7 x=z.left
8 RB-TRANSPLANT(T,z,z.right)
9 else y=TREE-MINiMUM(z.right)
10 y-original-color=y.color
11 x=y.right
12 if y.p==z
13 x.p=y
14 else RB-TRANSPLANT(T,y,y.right)
15 y.right=z.right
16 y.right.p=y
17 RB-TRANSPLANT(T,z,y)
18 y.left=z.left
19 y.left.p=y
20 y.color=z.color
21 if y-original-color==BLACK
22 RB-DELETB-FIXUP(T,x)
*/
///////////////////////////////////////
bool Delete(KEY key)
{
RB_Node*delete_point=find(key);
delete_point->RB_COLOR=find(key)->RB_COLOR;
RB_Node* delete_point_child;
if(delete_point==m_nullNode)
{
return false;
}
if (delete_point->left==m_nullNode)
{
delete_point_child=delete_point->right;
Transplant(delete_point,delete_point_child);
}
else if (delete_point->right=m_nullNode)
{
delete_point_child=delete_point->left;
Transplant(delete_point,delete_point_child);
}
else
{
delete_point=Minmum(delete_point->right);
delete_point->RB_COLOR=find(key)->RB_COLOR;
delete_point_child=delete_point->right;
if (delete_point->parent==find(key))
delete_point_child->parent=delete_point;
else
{
Transplant(delete_point,delete_point_child);
delete_point->right=find(key)->right;
delete_point->right->parent=delete_point;
}
Transplant(find(key),delete_point);
delete_point->left=find(key)->left;
delete_point->left->parent=delete_point;
delete_point->RB_COLOR=find(key)->RB_COLOR;
delete_point->date=find(key)->date;
}
if(delete_point->RB_COLOR==BLACK && !(delete_point_child==m_nullNode && delete_point_child->parent==m_nullNode))
{
DeleteFixUp(delete_point_child);
}
delete delete_point;
return true;
}
bool Transplant(RB_Node*U,RB_Node*V)
{
if(U->parent==m_nullNode)
m_root=V;
else if(U==U->parent->left)
U->parent->left=V;
else
U->parent->right=V;
U->parent=V->parent;
return true;
}
///////最小关键字/////////////
/*TREE-MIXMUM(x)
1 while x.left≠NIL
2 x=x.left
3 return x
*/
RB_Node*Minmum(RB_Node*node)
{
while(node->left!=m_nullNode)
node=node->left;
return node ;
}
///////////////////////////////
//////最大关键字/////////////
/*TREE-MAXIMUM(x)
1 while x.right≠NIL
2 x=x.right
3 return x
*/
///////////////////////////////
RB_Node*Maximum(RB_Node*node)
{
while(node->right!=m_nullNode)
node=node->right;
return node ;
}
//---------------------删除结点性质修复-----------------------------------
/*RB-DELETE-FIXUP(T,x)
1 while x≠T.root and x.color==BLACK
2 if x==x.p.left
3 w=x.p.right
4 if w.color==RED
5 w.color=BLACK //case 1
6 x.p.color=RED //case 1
7 LEFT-ROTATE(T,x.p) //case 1
8 w=x.p.right //case 1
9 if w.lef.color==BLACK and w.right.color==BLACK
10 w.color=RED //case 2
11 x=x.p //case 2
12 else if w.right.color==BLACK
13 w.left.color=BLACK //case3
14 w.color=RED //case 3
15 RIGHT-ROTATE(T,w) //case 3
16 w=x.p.right //case 3
17 w.color=x.p.color //case 4
18 x.p.color=BLACK //case 4
19 w.right.color=BLACK //case 4
20 LEFT-ROTATE(T,x.p) //case 4
21 x=T.root //case 4
22 else(same as then clause with "right" and "left" exchanged)
23 x.color=BLACK
*/
void DeleteFixUp(RB_Node* node)
{
while(node!=m_root&&node->RB_COLOR==BLACK)
{
if (node==node->parent->right)
{
RB_Node*brother=node->parent->left;
if (brother->RB_COLOR==RED) //情况1:x的兄弟w是红色的。
{
brother->RB_COLOR=BLACK;
node->parent->RB_COLOR=RED;
RotateLeft(node->parent);
}
else ////情况2:x的兄弟w是黑色的
{
if (brother->left->RB_COLOR==BLACK&& brother->right->RB_COLOR == BLACK)
//且w的俩个孩子都是黑色的//
{
brother->RB_COLOR=RED;
node=node->parent;
}
else if(brother->right->RB_COLOR == BLACK)
//情况3:x的兄弟w是黑色的,w的右孩子是黑色(w的左孩子是红色)。
{
brother->RB_COLOR = RED;
brother->left->RB_COLOR = BLACK;
RotateRight(brother);
}
else if (brother->right->RB_COLOR==RED)
//情况4:x的兄弟w是黑色的,且w的右孩子是红色的
{
brother->RB_COLOR=node->parent->RB_COLOR;
node->parent->RB_COLOR=BLACK;
brother->right->RB_COLOR =BLACK;
RotateLeft(node->parent);
}
}
}
else//下述情况针对上面的情况1中,node作为右孩子而阐述的。
//22 else (same as then clause with "right" and "left" exchanged)
//同样,原理一致,只是遇到左旋改为右旋,遇到右旋改为左旋,即可。其它代码不变。
{
RB_Node* brother =node->parent->left;
if(brother->RB_COLOR == RED)
{
brother->RB_COLOR = BLACK;
node->parent->RB_COLOR = RED;
RotateRight(node->parent);
}
else
{
if(brother->left->RB_COLOR==BLACK && brother->right->RB_COLOR == BLACK)
{
brother->RB_COLOR = RED;
node = node->parent;
}
else if(brother->left->RB_COLOR==BLACK)
{
brother->RB_COLOR = RED;
brother->right->RB_COLOR = BLACK;
RotateLeft(brother);
}
else if(brother->left->RB_COLOR==RED)
{
brother->RB_COLOR = node->parent->RB_COLOR;
node->parent->RB_COLOR = BLACK;
brother->left->RB_COLOR = BLACK;
RotateRight(node->parent);
node = m_root;
}
}
}
}
m_nullNode->parent = m_root; //最后将node置为根结点//
node->RB_COLOR = BLACK; //并改为黑色//
}
//////////前驱/////////////
/*TREE-PREDECESSOR(x)
1 if x.left≠NIL
2 return TREE-MAXIMUM(x.left)
3 y=x.p
4 while y≠NIL and x==y.left
5 x=y
6 y=y.p
return y
*/
////////////////////////////////////
inline RB_Node* InOrderPredecessor(RB_Node* node)
{
if(node==m_nullNode) //null node has no predecessor
{
return m_nullNode;
}
if(node->left!=m_nullNode)
return Maximum(node->left);
else
{
RB_Node* index = node->parent;
while(index!==m_nullNode&&node==index->left)
{
node=index;
index=index->parent;
}
return index;
}
}
//////////后继///////////////
/*TREE-SUCCESSOR(x)
1 if x.right≠NIL
2 return TREE-MINIMUM(x.right)
3 y=x.p
4 while y≠NIL and x==y.right
5 x=y
6 y=y.p
7 return y
*/
//////////////////////////////
inline RB_Node* InOrderSuccessor(RB_Node* node)
{
if(node==m_nullNode) //null node has no successor
{
return m_nullNode;
}
if (node->right!=m_nullNode)
{
return Minmum(node->right)
}
else
{
RB_Node*index=node->parent;
while (index!=m_nullNode&&node=index->right)
node=index;
index=index->parent;
}
return index;
}
//debug
void InOrderTraverse()
{
InOrderTraverse(m_root);
}
void CreateGraph(string filename)
{
//delete
}
void InOrderCreate(ofstream& file,RB_Node* node)
{
//delete
}
void InOrderTraverse(RB_Node* node)
{
if(node==m_nullNode)
{
return;
}
else
{
InOrderTraverse(node->left);
cout<<node->key<<endl;
InOrderTraverse(node->right);
}
}
~RB_Tree()
{
clear(m_root);
delete m_nullNode;
}
private:
// utility function for destructor to destruct object;
void clear(RB_Node* node)
{
if(node==m_nullNode)
{
return ;
}
else
{
clear(node->left);
clear(node->right);
delete node;
}
}
private:
RB_Node* m_nullNode;
RB_Node*m_root;
};
#endif
#define RB_TREE_H
#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
using namespace std;
template<class KEY ,class U>
class RB_Tree
{
private:
RB_Tree(const RB_Tree& input){}
const RB_Tree& operator=(const RB_Tree& input){}
private:
enum COLOR{RED,BLACK};
class RB_Node
{
public:
RB_Node():left(NULL),right(NULL),parent(NULL){}
COLOR RB_COLOR;
RB_Node*left;
RB_Node*right;
RB_Node*parent;
KEY key;
U date;
};
public:
RB_Tree():m_nullNode(new RB_Node),m_root(m_nullNode){}
bool Empty()const
{
if(m_root==m_nullNode)
{
return true;
}
else
{
return false;
}
}
RB_Node*find(KEY key)
{
RB_Node* index = m_root;
while(index != m_nullNode)
{
if (key<index->key)
{
index=index->left;
}
else if(key>index->key)
{
index=index->right;
}
else
{
break;
}
}
return index;
}
//--------------------//插入结点的总操作//------------------------
//全部的工作,都在下述伪代码中:///
/*TREE-INSERT(T,z)
1 y=T.nil
2 x=T.root
3 while x≠T.nil
4 y=x
5 if z.key<x.key
6 x=x.left
7 else x=x.right
8 z.p=y
9 if y==T.nil
10 T.root=z //tree Twas empty
11 else if z.key<y.key
12 y.left =z
13 else y.right=z
14 z.left=T.nil
15 z.right =T.nil
16 z.color=RED
17 RB-INSERT-PIXUP(T.z)
*/
//因为将z着为红色,可能会违反某一红黑性质。
//所以需要下面的RB-INSERT-PIXUP(T.z)来保持红黑性质。
bool Insert(KEY key, U date)
{
RB_Node *insert_point =m_nullNode;
RB_Node *index=m_root;
while(index!=m_nullNode)
{
insert_point=m_root;
if (key<index->key)
{
index=index->left;
}
else if(key>index->key)
{
index=index->right;
}
else
{
return false;
}
}
RB_Node* insert_node=new RB_Node();
insert_node->key=key;
insert_node->date=date;
insert_node->RB_COLOR=RED;
insert_node->right=m_nullNode;
insert_node->left=m_nullNode;
if (insert_point==m_nullNode)
{
m_root=insert_node;
m_root->parent=m_nullNode;
m_nullNode->right=m_root;
m_nullNode->left=m_root;
m_nullNode->parent=m_root;
}
else
{
if(key<insert_point->key)
{
insert_point->left=insert_node;
}
else
{
insert_point->right=insert_node;
}
insert_node->parent=insert_point;
}
InsertFixup(insert_node);
}
//---------------------//插入结点性质修复//--------------------------------
//3种插入情况,都在下面的伪代码中(未涉及到所有全部的插入情况)。
/* RB-INSERT-FIXUP(T, z)
1 while z.p.color==RED
2 if z.p==z.p.p.left
3 y=z.p.p.right
4 if y.color==RED
5 z.p.color=BLACK // case 1
6 y.color=BLACK // case 1
7 z.p.p.color=RED // case 1
8 z=z.p.p // case 1
9 else if z==z.p.right
10 z=z.p // case 2
11 LEFT_ROTATE(T,z) // case 2
12 z.p.color=BLACK // case 3
13 z.p.p.color=RED // case 3
14 RIGHT-ROTATE(T,z.p.p) // case 3
15 else(same as then clause
with "right" and"left" exchanged)
16 T.root.color=BLACK
*/
void InsertFixup(RB_Node* node)
{
while(node->parent->RB_COLOR=RED)
{
if (node->parent==node->parent->parent->left)
{
RB_Node* uncle=node->parent->parent->right;
if (uncle->RB_COLOR==RED)//插入情况1,z的叔叔y是红色的。
{
node->parent->RB_COLOR=BLACK;
uncle->RB_COLOR=BLACK;
node->parent->parent->RB_COLOR=RED;
node=node->parent->parent;
}
else if (uncle->RB_COLOR==BLACK) //插入情况2:z的叔叔y是黑色的,。
{
if (node==node->parent->right)
{
node=node->parent;
RotateLeft(node);
}
else//插入情况3:z的叔叔y是黑色的,但z是左孩子。
{
node->parent->RB_COLOR = BLACK;
node->parent->parent->RB_COLOR = RED;
RotateRight(node->parent->parent);
}
}
}
else //这部分是针对为插入情况1中,z的父亲现在作为祖父的右孩子了的情况,而写的。
//15 else (same as then clause with "right" and "left" exchanged)
{
RB_Node* uncle = node->parent->parent->left;
if(uncle->RB_COLOR == RED)
{
node->parent->RB_COLOR = BLACK;
uncle->RB_COLOR = BLACK;
uncle->parent->RB_COLOR = RED;
node = node->parent->parent;
}
else if(uncle->RB_COLOR == BLACK)
{
if(node == node->parent->left)
{
node = node->parent;
RotateRight(node); //与上述代码相比,左旋改为右旋 ;
}
else
{
node->parent->RB_COLOR = BLACK;
node->parent->parent->RB_COLOR = RED;
RotateLeft(node->parent->parent); //右旋改为左旋,即可。
}
}
}
}
m_root->RB_COLOR = BLACK;
}
//////左旋////////////
/*LEFT-ROTATE(T,x)
1 y=x.right
2 x.right=y.left
3 if y.left≠T.nil
4 y.left.p=x
5 y.p=x.p
6 if x.p==T.nil
7 T.root=y
8 else if x==x.p.left
9 x.p.left=y
10 else x.p.right=y
11 y.left=x
12 x.p=y
*/
//左旋代码实现 ;
bool RotateLeft(RB_Node *node)
{
if(node==m_nullNode||node->right==m_nullNode)
{
return false;//can't rotate
}
RB_Node*lower_right=node->right;
lower_right->parent=node->parent;
node->right=lower_right->left;
if (lower_right->left!=m_nullNode)
{
lower_right->left->parent=node;
}
if (node->parent==m_nullNode)
{
m_root=lower_right;
m_nullNode->left=m_root;
m_nullNode->right=m_root;
}
else
{
if ( node==node->parent->left)
{
node->parent->left=lower_right;
}
else
{
node->parent->right=lower_right;
}
}
node->parent=lower_right;
lower_right->left=node;
}
//////右旋////
/*RIGHT-ROTATE(T,y)
1x=y.left
2y.left=x.right
3 if x.right≠T.nil
4 x.right.p=x
5 x.p=y.p
6 if y.p==T.nil
7 T.root=x
8 else if y==y.p.left
9 y.p.left=x
10 else y.p.right=x
11 x.p.right=y
12 y.p=x
*/
//右旋代码实现 //
bool RotateRight(RB_Node *node)
{
if(node==m_nullNode||node->left==m_nullNode)
{
return false;//can't rotate
}
RB_Node*lower_left=node->left;
node->left=lower_left->right;
lower_left->parent=node->parent;
if (lower_left->right!=m_nullNode)
{
lower_left->right->parent=node;
}
if (node->parent==m_nullNode)
{
m_root=lower_left;
m_nullNode->left=m_root;
m_nullNode->right=m_root;
}
else
{
if ( node==node->parent->right)
{
node->parent->right=lower_left;
}
else
{
node->parent->left=lower_left;
}
}
node->parent=lower_left;
lower_left->right=node;
}
//--------------------------删除结点总操作--------------------------------
/*RB-DEKETE(T,z)
1 y=z
2 y-original-color=y.color
3 if x.left==T.nil
4 x=z.right
5 RB-TRANSPLANT(T,z,z.right)
6 else if z.right==T.nil
7 x=z.left
8 RB-TRANSPLANT(T,z,z.right)
9 else y=TREE-MINiMUM(z.right)
10 y-original-color=y.color
11 x=y.right
12 if y.p==z
13 x.p=y
14 else RB-TRANSPLANT(T,y,y.right)
15 y.right=z.right
16 y.right.p=y
17 RB-TRANSPLANT(T,z,y)
18 y.left=z.left
19 y.left.p=y
20 y.color=z.color
21 if y-original-color==BLACK
22 RB-DELETB-FIXUP(T,x)
*/
///////////////////////////////////////
bool Delete(KEY key)
{
RB_Node*delete_point=find(key);
delete_point->RB_COLOR=find(key)->RB_COLOR;
RB_Node* delete_point_child;
if(delete_point==m_nullNode)
{
return false;
}
if (delete_point->left==m_nullNode)
{
delete_point_child=delete_point->right;
Transplant(delete_point,delete_point_child);
}
else if (delete_point->right=m_nullNode)
{
delete_point_child=delete_point->left;
Transplant(delete_point,delete_point_child);
}
else
{
delete_point=Minmum(delete_point->right);
delete_point->RB_COLOR=find(key)->RB_COLOR;
delete_point_child=delete_point->right;
if (delete_point->parent==find(key))
delete_point_child->parent=delete_point;
else
{
Transplant(delete_point,delete_point_child);
delete_point->right=find(key)->right;
delete_point->right->parent=delete_point;
}
Transplant(find(key),delete_point);
delete_point->left=find(key)->left;
delete_point->left->parent=delete_point;
delete_point->RB_COLOR=find(key)->RB_COLOR;
delete_point->date=find(key)->date;
}
if(delete_point->RB_COLOR==BLACK && !(delete_point_child==m_nullNode && delete_point_child->parent==m_nullNode))
{
DeleteFixUp(delete_point_child);
}
delete delete_point;
return true;
}
bool Transplant(RB_Node*U,RB_Node*V)
{
if(U->parent==m_nullNode)
m_root=V;
else if(U==U->parent->left)
U->parent->left=V;
else
U->parent->right=V;
U->parent=V->parent;
return true;
}
///////最小关键字/////////////
/*TREE-MIXMUM(x)
1 while x.left≠NIL
2 x=x.left
3 return x
*/
RB_Node*Minmum(RB_Node*node)
{
while(node->left!=m_nullNode)
node=node->left;
return node ;
}
///////////////////////////////
//////最大关键字/////////////
/*TREE-MAXIMUM(x)
1 while x.right≠NIL
2 x=x.right
3 return x
*/
///////////////////////////////
RB_Node*Maximum(RB_Node*node)
{
while(node->right!=m_nullNode)
node=node->right;
return node ;
}
//---------------------删除结点性质修复-----------------------------------
/*RB-DELETE-FIXUP(T,x)
1 while x≠T.root and x.color==BLACK
2 if x==x.p.left
3 w=x.p.right
4 if w.color==RED
5 w.color=BLACK //case 1
6 x.p.color=RED //case 1
7 LEFT-ROTATE(T,x.p) //case 1
8 w=x.p.right //case 1
9 if w.lef.color==BLACK and w.right.color==BLACK
10 w.color=RED //case 2
11 x=x.p //case 2
12 else if w.right.color==BLACK
13 w.left.color=BLACK //case3
14 w.color=RED //case 3
15 RIGHT-ROTATE(T,w) //case 3
16 w=x.p.right //case 3
17 w.color=x.p.color //case 4
18 x.p.color=BLACK //case 4
19 w.right.color=BLACK //case 4
20 LEFT-ROTATE(T,x.p) //case 4
21 x=T.root //case 4
22 else(same as then clause with "right" and "left" exchanged)
23 x.color=BLACK
*/
void DeleteFixUp(RB_Node* node)
{
while(node!=m_root&&node->RB_COLOR==BLACK)
{
if (node==node->parent->right)
{
RB_Node*brother=node->parent->left;
if (brother->RB_COLOR==RED) //情况1:x的兄弟w是红色的。
{
brother->RB_COLOR=BLACK;
node->parent->RB_COLOR=RED;
RotateLeft(node->parent);
}
else ////情况2:x的兄弟w是黑色的
{
if (brother->left->RB_COLOR==BLACK&& brother->right->RB_COLOR == BLACK)
//且w的俩个孩子都是黑色的//
{
brother->RB_COLOR=RED;
node=node->parent;
}
else if(brother->right->RB_COLOR == BLACK)
//情况3:x的兄弟w是黑色的,w的右孩子是黑色(w的左孩子是红色)。
{
brother->RB_COLOR = RED;
brother->left->RB_COLOR = BLACK;
RotateRight(brother);
}
else if (brother->right->RB_COLOR==RED)
//情况4:x的兄弟w是黑色的,且w的右孩子是红色的
{
brother->RB_COLOR=node->parent->RB_COLOR;
node->parent->RB_COLOR=BLACK;
brother->right->RB_COLOR =BLACK;
RotateLeft(node->parent);
}
}
}
else//下述情况针对上面的情况1中,node作为右孩子而阐述的。
//22 else (same as then clause with "right" and "left" exchanged)
//同样,原理一致,只是遇到左旋改为右旋,遇到右旋改为左旋,即可。其它代码不变。
{
RB_Node* brother =node->parent->left;
if(brother->RB_COLOR == RED)
{
brother->RB_COLOR = BLACK;
node->parent->RB_COLOR = RED;
RotateRight(node->parent);
}
else
{
if(brother->left->RB_COLOR==BLACK && brother->right->RB_COLOR == BLACK)
{
brother->RB_COLOR = RED;
node = node->parent;
}
else if(brother->left->RB_COLOR==BLACK)
{
brother->RB_COLOR = RED;
brother->right->RB_COLOR = BLACK;
RotateLeft(brother);
}
else if(brother->left->RB_COLOR==RED)
{
brother->RB_COLOR = node->parent->RB_COLOR;
node->parent->RB_COLOR = BLACK;
brother->left->RB_COLOR = BLACK;
RotateRight(node->parent);
node = m_root;
}
}
}
}
m_nullNode->parent = m_root; //最后将node置为根结点//
node->RB_COLOR = BLACK; //并改为黑色//
}
//////////前驱/////////////
/*TREE-PREDECESSOR(x)
1 if x.left≠NIL
2 return TREE-MAXIMUM(x.left)
3 y=x.p
4 while y≠NIL and x==y.left
5 x=y
6 y=y.p
return y
*/
////////////////////////////////////
inline RB_Node* InOrderPredecessor(RB_Node* node)
{
if(node==m_nullNode) //null node has no predecessor
{
return m_nullNode;
}
if(node->left!=m_nullNode)
return Maximum(node->left);
else
{
RB_Node* index = node->parent;
while(index!==m_nullNode&&node==index->left)
{
node=index;
index=index->parent;
}
return index;
}
}
//////////后继///////////////
/*TREE-SUCCESSOR(x)
1 if x.right≠NIL
2 return TREE-MINIMUM(x.right)
3 y=x.p
4 while y≠NIL and x==y.right
5 x=y
6 y=y.p
7 return y
*/
//////////////////////////////
inline RB_Node* InOrderSuccessor(RB_Node* node)
{
if(node==m_nullNode) //null node has no successor
{
return m_nullNode;
}
if (node->right!=m_nullNode)
{
return Minmum(node->right)
}
else
{
RB_Node*index=node->parent;
while (index!=m_nullNode&&node=index->right)
node=index;
index=index->parent;
}
return index;
}
//debug
void InOrderTraverse()
{
InOrderTraverse(m_root);
}
void CreateGraph(string filename)
{
//delete
}
void InOrderCreate(ofstream& file,RB_Node* node)
{
//delete
}
void InOrderTraverse(RB_Node* node)
{
if(node==m_nullNode)
{
return;
}
else
{
InOrderTraverse(node->left);
cout<<node->key<<endl;
InOrderTraverse(node->right);
}
}
~RB_Tree()
{
clear(m_root);
delete m_nullNode;
}
private:
// utility function for destructor to destruct object;
void clear(RB_Node* node)
{
if(node==m_nullNode)
{
return ;
}
else
{
clear(node->left);
clear(node->right);
delete node;
}
}
private:
RB_Node* m_nullNode;
RB_Node*m_root;
};
#endif
- 红黑树学习
- 学习红黑树
- 红黑树学习
- 红黑树学习
- 学习红黑树
- 红黑树学习
- 学习红黑树
- 红黑树学习
- 红黑树学习记录
- 红黑树学习小结
- 红黑树学习笔记
- 红黑树的学习笔记
- 红黑树学习笔记
- 从multimap学习红黑树
- 红黑树学习笔记
- JDK TreeMap 红黑树学习
- 红黑树学习tips
- 算法学习----红黑树
- asp.net 生成静态html页面
- CMake 基本使用方法--写CMakeList.txt
- 教你如何用Windows7笔记本打造WiFi热点
- 类型声明typedef和define的区别
- 如何使用CMAKE生成makefile文件
- 学习红黑树
- Android::开机自启动C程序
- 如何去掉右键显卡中的图形选项和图形属性
- JVM内存参数详解及其配置调优
- 可滚动结果集
- 黑客攻防:探秘黑客的巢穴! 黑客——比特网
- 华表js 操作
- 关于需求
- MVC学习二