算法导论-红黑树C++实现

红黑树的定义:

一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树:

1)每个节点或是红的,或是黑的。

2)根节点是黑的。

3)每个叶节点(NIL)是黑节点。

4)如果一个节点是红的,则它的两个儿子都是黑的。

5)对每个节点,从该节点到其子孙节点的所有路径上包含相同节点数目的黑节点。

 

C++代码实现:

BRTreeNode.h

 

[cpp] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 14px">#ifndef BRTREENODE_H_INCLUDED 
  2. #define BRTREENODE_H_INCLUDED  
  3. #include<iostream>  
  4. usingnamespace std; 
  5. class BRTree; 
  6. class BRTreeNode 
  7. private
  8.     friendclass BRTree; 
  9.     int key; 
  10.     bool color; 
  11.     BRTreeNode* left; 
  12.     BRTreeNode* right; 
  13.     BRTreeNode* parent; 
  14. public
  15.     BRTreeNode():key(-1),color(0),left(NULL),right(NULL),parent(NULL){} 
  16.     BRTreeNode(BRTreeNode* node):key(node->key),color(node->color),left(node->left),right(node->right),parent(node->parent) 
  17.     {} 
  18.     BRTreeNode(int num,bool flag):key(num),color(flag),left(NULL),right(NULL),parent(NULL){} 
  19.     ~BRTreeNode() 
  20.     { 
  21.  
  22.     } 
  23.     int Getkey() 
  24.     { 
  25.         return key; 
  26.     } 
  27.     bool Getcolor() 
  28.     { 
  29.         returnthis->color; 
  30.     } 
  31.     BRTreeNode* GetLeft() 
  32.     { 
  33.         returnthis->left; 
  34.     } 
  35.     BRTreeNode* Getright() 
  36.     { 
  37.         returnthis->right; 
  38.     } 
  39.     BRTreeNode* Getparent() 
  40.     { 
  41.         returnthis->parent; 
  42.     } 
  43.     void Inorder() 
  44.     { 
  45.         if(this!=NULL) 
  46.         { 
  47.             this->left->Inorder(); 
  48.             cout<<this->key<<" "
  49.             this->right->Inorder(); 
  50.         } 
  51.     } 
  52.     void Preorder() 
  53.     { 
  54.         if(this!=NULL) 
  55.         { 
  56.             cout<<this->key<<" "
  57.             this->left->Preorder(); 
  58.             this->right->Preorder(); 
  59.         } 
  60.     } 
  61.     void Postorder() 
  62.     { 
  63.         if(this!=NULL) 
  64.         { 
  65.             this->left->Postorder(); 
  66.             this->right->Postorder(); 
  67.             cout<<this->key<<" "
  68.         } 
  69.     } 
  70.  
  71.     void MakeEmpty() 
  72.     { 
  73.         if(this!=NULL) 
  74.         { 
  75.             this->left->MakeEmpty(); 
  76.             this->right->MakeEmpty(); 
  77.             deletethis
  78.         } 
  79.     } 
  80.     int GetHeight() 
  81.     { 
  82.         int L,R; 
  83.         if(this==NULL) 
  84.         { 
  85.             return 0; 
  86.         } 
  87.         L=this->left->GetHeight(); 
  88.         R=this->right->GetHeight(); 
  89.         return 1+(L>R? L:R); 
  90.     } 
  91. }; 
  92.  
  93.  
  94. #endif // BRTREENODE_H_INCLUDED  
  95. </SPAN> 
#ifndef BRTREENODE_H_INCLUDED
#define BRTREENODE_H_INCLUDED
#include<iostream>
using namespace std;
class BRTree;
class BRTreeNode
{
private:
	friend class BRTree;
	int key;
	bool color;
	BRTreeNode* left;
	BRTreeNode* right;
	BRTreeNode* parent;
public:
	BRTreeNode():key(-1),color(0),left(NULL),right(NULL),parent(NULL){}
	BRTreeNode(BRTreeNode* node):key(node->key),color(node->color),left(node->left),right(node->right),parent(node->parent)
	{}
	BRTreeNode(int num,bool flag):key(num),color(flag),left(NULL),right(NULL),parent(NULL){}
	~BRTreeNode()
	{

	}
	int Getkey()
	{
		return key;
	}
	bool Getcolor()
	{
		return this->color;
	}
	BRTreeNode* GetLeft()
	{
		return this->left;
	}
	BRTreeNode* Getright()
	{
		return this->right;
	}
	BRTreeNode* Getparent()
	{
		return this->parent;
	}
	void Inorder()
	{
		if(this!=NULL)
		{
			this->left->Inorder();
			cout<<this->key<<" ";
			this->right->Inorder();
		}
	}
	void Preorder()
	{
		if(this!=NULL)
		{
			cout<<this->key<<" ";
			this->left->Preorder();
			this->right->Preorder();
		}
	}
	void Postorder()
	{
		if(this!=NULL)
		{
			this->left->Postorder();
			this->right->Postorder();
			cout<<this->key<<" ";
		}
	}

	void MakeEmpty()
	{
		if(this!=NULL)
		{
			this->left->MakeEmpty();
			this->right->MakeEmpty();
			delete this;
		}
	}
	int GetHeight()
	{
		int L,R;
		if(this==NULL)
		{
			return 0;
		}
		L=this->left->GetHeight();
		R=this->right->GetHeight();
		return 1+(L>R? L:R);
	}
};


#endif // BRTREENODE_H_INCLUDED

BRTree.h

 

 

[cpp] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 14px">#ifndef BRTREE_H_INCLUDED 
  2. #define BRTREE_H_INCLUDED  
  3. #define maxSize 30  
  4. #define maxWidth 30  
  5. #include"BRTreeNode.h"  
  6. class BRTree 
  7. private
  8.     BRTreeNode* root; 
  9.     BRTreeNode* nil; 
  10. public
  11.     BRTree():nil(new BRTreeNode()) 
  12.     { 
  13.         nil->color=0; 
  14.         nil->key=-1; 
  15.         nil->left=nil->right=nil->parent=NULL; 
  16.         root=nil; 
  17.     } 
  18.     ~BRTree() 
  19.     { 
  20.         MakeEmpty(root); 
  21.         delete nil; 
  22.     } 
  23.     //清空以node为根节点的树  
  24.     void MakeEmpty(BRTreeNode*node) 
  25.     { 
  26.         if(node!=nil) 
  27.         { 
  28.             MakeEmpty(node->left); 
  29.             MakeEmpty(node->right); 
  30.             delete node; 
  31.         } 
  32.     } 
  33.     int Getkey(BRTreeNode* node) 
  34.     { 
  35.         return node->Getkey(); 
  36.     } 
  37.     bool Getcolor(BRTreeNode* node) 
  38.     { 
  39.         return node->Getcolor(); 
  40.     } 
  41.     BRTreeNode* Getroot() 
  42.     { 
  43.         return root; 
  44.     } 
  45.     BRTreeNode* GetParent(BRTreeNode*node) 
  46.     { 
  47.         return node->parent; 
  48.     } 
  49.     int GetHeight(BRTreeNode* node) 
  50.     { 
  51.         int L,R; 
  52.         if(node==nil) 
  53.             return 0; 
  54.         L=GetHeight(node->left); 
  55.         R=GetHeight(node->right); 
  56.         return 1+(L>R? L:R); 
  57.     } 
  58.     int GetBlackHeight(BRTreeNode* node) 
  59.     { 
  60.         int L,R; 
  61.         if(node==nil) return 0; 
  62.         L=GetHeight(node->left); 
  63.         R=GetHeight(node->right); 
  64.         if(node->Getcolor()) return(L>R? L:R); 
  65.         elsereturn 1+(L>R? L:R); 
  66.     } 
  67.     void Inorder(BRTreeNode*node) 
  68.     { 
  69.         if(node!=nil) 
  70.         { 
  71.             Inorder(node->left); 
  72.             cout<<node->key<<" "
  73.             Inorder(node->right); 
  74.         } 
  75.     } 
  76.     void Preorder(BRTreeNode*node) 
  77.     { 
  78.         if(node!=nil) 
  79.         { 
  80.             cout<<node->key<<" "
  81.             Preorder(node->left); 
  82.             Preorder(node->right); 
  83.         } 
  84.     } 
  85.     void Posetorder(BRTreeNode*node) 
  86.     { 
  87.         if(node!=nil) 
  88.         { 
  89.             Posetorder(node->left); 
  90.             Posetorder(node->right); 
  91.             cout<<node->key<<" "
  92.         } 
  93.     } 
  94.     //层次法打印树  
  95. void DispTree(BRTreeNode*BT) 
  96.     BRTreeNode stack[maxSize],p; 
  97.     int level[maxSize][2],top,n,i,width=4; 
  98.     if(BT!=NULL) 
  99.     { 
  100.         cout<<"Display a tree by hollow means."<<endl; 
  101.         top=1; 
  102.         stack[top]=BT;//push root point to stack.  
  103.         level[top][0]=width; 
  104.         while(top>0) 
  105.         { 
  106.             p=stack[top]; 
  107.             n=level[top][0]; 
  108.             for(i=1;i<=n;i++) 
  109.                 cout<<" "
  110.             //输出信息  
  111.             if(p.key==0) 
  112.             { 
  113.                 cout<<")"
  114.             } 
  115.             else
  116.             if(p.key==-1) cout<<"Nil"
  117.             elseif(p.left&&p.right) cout<<"("<<p.key; 
  118.             else cout<<p.key; 
  119.             if(p.Getcolor()) cout<<"R,"
  120.             else cout<<"B,"
  121.             } 
  122.             for(i=n+1;i<maxWidth;i+=2) 
  123.                 cout<<"--"
  124.             cout<<endl; 
  125.             top--; 
  126.             if(p.right!=NULL) 
  127.             { 
  128.                 //插入一个括号节点,key值为0  
  129.                 top++; 
  130.                 BRTreeNode* tmp=new BRTreeNode(); 
  131.                 tmp->key=0; 
  132.                 stack[top]=tmp; 
  133.                 level[top][0]=n+width; 
  134.                 level[top][1]=2; 
  135.                 top++; 
  136.                 stack[top]=p.right; 
  137.                 level[top][0]=n+width; 
  138.                 level[top][1]=2; 
  139.  
  140.             } 
  141.             if(p.left!=NULL) 
  142.             { 
  143.                 top++; 
  144.                 stack[top]=p.left; 
  145.                 level[top][0]=n+width; 
  146.                 level[top][1]=1; 
  147.             } 
  148.         } 
  149.     } 
  150.     //左旋节点node  
  151.     bool LeftRotate(BRTreeNode* node) 
  152.     { 
  153.         BRTreeNode*y; 
  154.         if(node->right==nil) 
  155.         { 
  156.             cout<<"can't left rotate!"<<endl; 
  157.             return 0; 
  158.         } 
  159.         y=node->right; 
  160.         node->right=y->left; 
  161.         if(y->left!=nil) 
  162.         { 
  163.             y->left->parent=node; 
  164.         } 
  165.         y->parent=node->parent; 
  166.         if(node->parent==nil) 
  167.         { 
  168.             root=y; 
  169.         } 
  170.         elseif(node->parent->left==node) 
  171.         { 
  172.             node->parent->left=y; 
  173.         } 
  174.         else 
  175.         { 
  176.             node->parent->right=y; 
  177.         } 
  178.         y->left=node; 
  179.         node->parent=y; 
  180.         return 1; 
  181.     } 
  182.     //右旋节点  
  183.     bool RightRotate(BRTreeNode* node) 
  184.     { 
  185.         if(node->left==nil) 
  186.         { 
  187.             cout<<"can't rightrotate!"<<endl; 
  188.             return 0; 
  189.         } 
  190.         BRTreeNode* x; 
  191.         x=node->left; 
  192.         node->left=x->right; 
  193.         if(x->right!=nil) 
  194.         { 
  195.             x->right->parent=node; 
  196.         } 
  197.         x->parent=node->parent; 
  198.         if(node->parent==nil) 
  199.         { 
  200.             root=x; 
  201.         } 
  202.         elseif(node->parent->left==node) 
  203.         { 
  204.             node->parent->left=x; 
  205.         } 
  206.         else 
  207.         { 
  208.             node->parent->right=x; 
  209.         } 
  210.         node->parent=x; 
  211.         x->right=node; 
  212.         return 1; 
  213.     } 
  214.     void Insert(int num) 
  215.     { 
  216.         BRTreeNode* node=new BRTreeNode(num,1); 
  217.         node->left=nil; 
  218.         node->right=nil; 
  219.         node->parent=nil; 
  220.         BRTreeNode* p=root,*q=nil; 
  221.         if(root==nil) 
  222.         { 
  223.             node->color=0; 
  224.             root=node; 
  225.             root->left=root->right=root->parent=nil; 
  226.             return
  227.         } 
  228.         while(p!=nil) 
  229.         { 
  230.             if(p->key==num) 
  231.             { 
  232.                 cout<<num<<"  has exist!"<<endl; 
  233.                 return
  234.             } 
  235.             elseif(p->key>num) 
  236.             { 
  237.                 q=p; 
  238.                 p=p->left; 
  239.             } 
  240.             else 
  241.             { 
  242.                 q=p; 
  243.                 p=p->right; 
  244.             } 
  245.         } 
  246.         if(q->key>num) 
  247.         { 
  248.             q->left=node; 
  249.             node->parent=q; 
  250.         } 
  251.         else 
  252.         { 
  253.             q->right=node; 
  254.             node->parent=q; 
  255.         } 
  256.         RBInsertAdjust(node); 
  257.     } 
  258.     void RBInsertAdjust(BRTreeNode* node) 
  259.     { 
  260.         BRTreeNode* y; 
  261.         while(node->parent->color==1) 
  262.         { 
  263.             if(node->parent==node->parent->parent->left) 
  264.             { 
  265.                 y=node->parent->parent->right; 
  266.                 if(y->color==1) 
  267.                 { 
  268.                     node->parent->color=0; 
  269.                     y->color=0; 
  270.                     y->parent->color=1; 
  271.                     node=node->parent->parent; 
  272.                 } 
  273.                 //此时y的颜色是黑色  
  274.                 else 
  275.                 { 
  276.                     //第二种情况  
  277.                     if(node==node->parent->right) 
  278.                     { 
  279.                         node=node->parent; 
  280.                         LeftRotate(node); 
  281.                     } 
  282.                     //第三种情况  
  283.                     node->parent->color=0; 
  284.                     node->parent->parent->color=1; 
  285.                     RightRotate(node->parent->parent); 
  286.                 } 
  287.             } 
  288.             else 
  289.             { 
  290.                 y=node->parent->parent->left; 
  291.                 if(y->color==1) 
  292.                 { 
  293.                     node->parent->color=0; 
  294.                     y->color=0; 
  295.                     y->parent->color=1; 
  296.                     node=node->parent->parent; 
  297.                 } 
  298.                 else 
  299.                 { 
  300.                     if(node==node->parent->left) 
  301.                     { 
  302.                         node=node->parent; 
  303.                         RightRotate(node); 
  304.                     } 
  305.                     node->parent->color=0; 
  306.                     node->parent->parent->color=1; 
  307.                     LeftRotate(node->parent->parent); 
  308.                 } 
  309.             } 
  310.         } 
  311.         root->color=0; 
  312.     } 
  313.     BRTreeNode* Search(int num) 
  314.     { 
  315.         BRTreeNode* p=root; 
  316.         while(p!=nil) 
  317.         { 
  318.             if(p->key==num) 
  319.             { 
  320.                 return p; 
  321.             } 
  322.             elseif(p->key>num) 
  323.             { 
  324.                 p=p->left; 
  325.             } 
  326.             else 
  327.             { 
  328.                 p=p->right; 
  329.             } 
  330.         } 
  331.         cout<<"there is no "<<num<<" in this tree!"<<endl; 
  332.         return nil; 
  333.     } 
  334.     //获取以node节点为根节点的树的最小元素,并返回该最小值  
  335.     int Minnum(BRTreeNode*node) 
  336.     { 
  337.         BRTreeNode*p=node; 
  338.         while(p->left!=nil) 
  339.         { 
  340.             p=p->left; 
  341.         } 
  342.         return p->key; 
  343.     } 
  344.     //获取以node节点为根节点的树的最da元素,并返回该最da值  
  345.     int Maxnum(BRTreeNode*node) 
  346.     { 
  347.         BRTreeNode*p=node; 
  348.         while(p->right!=nil) 
  349.         { 
  350.             p=p->right; 
  351.         } 
  352.         return p->key; 
  353.     } 
  354.     //获取以node节点为根节点的树的最小元素,并返回该节点  
  355.     BRTreeNode* MinNum(BRTreeNode*node) 
  356.     { 
  357.         BRTreeNode*p=node; 
  358.         while(p->left!=nil) 
  359.         { 
  360.             p=p->left; 
  361.         } 
  362.         return p; 
  363.     } 
  364.     //获取以node节点为根节点的树的最大元素  
  365.     BRTreeNode* MaxNum(BRTreeNode*node) 
  366.     { 
  367.         BRTreeNode*p=node; 
  368.         while(p->right!=nil) 
  369.         { 
  370.             p=p->right; 
  371.         } 
  372.         return p; 
  373.     } 
  374.     BRTreeNode*InorderSuccessor(BRTreeNode*node) 
  375.     { 
  376.         if(node->right!=nil) 
  377.         { 
  378.             return MinNum(node->right); 
  379.         } 
  380.         else 
  381.         { 
  382.             BRTreeNode*p=GetParent(node); 
  383.             while(p&&node==p->right) 
  384.             { 
  385.                 node=p; 
  386.                 p=GetParent(node); 
  387.             } 
  388.             return p; 
  389.         } 
  390.     } 
  391.     //中序遍历的前趋  
  392.     BRTreeNode*InordePredecessor(BRTreeNode*node) 
  393.     { 
  394.         if(node->left!=nil) 
  395.         { 
  396.             return MaxNum(node->left); 
  397.         } 
  398.         else 
  399.         { 
  400.             BRTreeNode*p=GetParent(node); 
  401.             while(p&&node==p->left) 
  402.             { 
  403.                 node=p; 
  404.                 p=GetParent(node); 
  405.             } 
  406.             return p; 
  407.         } 
  408.     } 
  409.     bool Delete(int num) 
  410.     { 
  411.         BRTreeNode*z,*y,*x; 
  412.         //寻找key值为num的节点p  
  413.         z=Search(num); 
  414.         //如果没有该节点则返回0  
  415.         if(z==nil) 
  416.         { 
  417.             return 0; 
  418.         } 
  419.         if(z->left==nil||z->right==nil) 
  420.         { 
  421.             y=z; 
  422.         } 
  423.         else 
  424.             y=InorderSuccessor(z); 
  425.         if(y->left!=nil) 
  426.             x=y->left; 
  427.         else 
  428.             x=y->right; 
  429.         x->parent=y->parent; 
  430.         if(x->parent==nil) 
  431.             root=x; 
  432.         elseif(y=y->parent->left) 
  433.             y->parent->left=x; 
  434.         else 
  435.             y->parent->right=x; 
  436.         if(y!=z) 
  437.         { 
  438.             z->key=y->key; 
  439.         } 
  440.         if(y->color==0) 
  441.         { 
  442.             RBTreeFixup(x); 
  443.         } 
  444.         return 1; 
  445.     } 
  446.     void RBTreeFixup(BRTreeNode* x) 
  447.     { 
  448.         BRTreeNode*w; 
  449.         while(x!=root&&x->color==0) 
  450.         { 
  451.             if(x==x->parent->left) 
  452.             { 
  453.                 w=x->parent->right; 
  454.                 if(w->color==1) 
  455.                 { 
  456.                     w->color=0; 
  457.                     x->parent->color=1; 
  458.                     LeftRotate(x->parent); 
  459.                     w=x->parent->right; 
  460.                 } 
  461.                 if(w->left->color==0&&w->right->color==0) 
  462.                 { 
  463.                     w->color=1; 
  464.                     x=x->parent; 
  465.                 } 
  466.                 else 
  467.                 { 
  468.                     if(w->right->color==0) 
  469.                     { 
  470.                         w->color=1; 
  471.                         RightRotate(w); 
  472.                         w=x->parent->right; 
  473.                     } 
  474.                     w->color=x->parent->color; 
  475.                     x->parent->color=0; 
  476.                     w->right->color=0; 
  477.                     LeftRotate(x->parent); 
  478.                     x=root; 
  479.                 } 
  480.             } 
  481.             else 
  482.             { 
  483.                 w=x->parent->left; 
  484.                 if(w->color==1) 
  485.                 { 
  486.                     w->color=0; 
  487.                     x->parent->color=1; 
  488.                     RightRotate(x->parent); 
  489.                     w=x->parent->left; 
  490.                 } 
  491.                 if(w->right->color==0&&w->left->color==0) 
  492.                 { 
  493.                     w->color=1; 
  494.                     x=x->parent; 
  495.                 } 
  496.                 else 
  497.                 { 
  498.                     if(w->left->color==0) 
  499.                     { 
  500.                         w->color=1; 
  501.                         LeftRotate(w); 
  502.                         w=x->parent->left; 
  503.                     } 
  504.                     w->color=x->parent->color; 
  505.                     x->parent->color=0; 
  506.                     w->left->color=0; 
  507.                     RightRotate(x->parent); 
  508.                     x=root; 
  509.                 } 
  510.             } 
  511.         } 
  512.         x->color=0; 
  513.     } 
  514. }; 
  515.  
  516. #endif // BRTREE_H_INCLUDED  
  517. </SPAN> 
#ifndef BRTREE_H_INCLUDED
#define BRTREE_H_INCLUDED
#define maxSize 30
#define maxWidth 30
#include"BRTreeNode.h"
class BRTree
{
private:
	BRTreeNode* root;
	BRTreeNode* nil;
public:
	BRTree():nil(new BRTreeNode())
	{
		nil->color=0;
		nil->key=-1;
		nil->left=nil->right=nil->parent=NULL;
		root=nil;
	}
	~BRTree()
	{
		MakeEmpty(root);
		delete nil;
	}
	//清空以node为根节点的树
	void MakeEmpty(BRTreeNode*node)
	{
		if(node!=nil)
		{
			MakeEmpty(node->left);
			MakeEmpty(node->right);
			delete node;
		}
	}
	int Getkey(BRTreeNode* node)
	{
		return node->Getkey();
	}
	bool Getcolor(BRTreeNode* node)
	{
		return node->Getcolor();
	}
	BRTreeNode* Getroot()
	{
		return root;
	}
	BRTreeNode* GetParent(BRTreeNode*node)
	{
		return node->parent;
	}
	int GetHeight(BRTreeNode* node)
	{
		int L,R;
		if(node==nil)
			return 0;
		L=GetHeight(node->left);
		R=GetHeight(node->right);
		return 1+(L>R? L:R);
	}
    int GetBlackHeight(BRTreeNode* node)
	{
		int L,R;
		if(node==nil) return 0;
		L=GetHeight(node->left);
		R=GetHeight(node->right);
		if(node->Getcolor()) return(L>R? L:R);
		else return 1+(L>R? L:R);
	}
	void Inorder(BRTreeNode*node)
	{
		if(node!=nil)
		{
			Inorder(node->left);
			cout<<node->key<<" ";
			Inorder(node->right);
		}
	}
	void Preorder(BRTreeNode*node)
	{
		if(node!=nil)
		{
			cout<<node->key<<" ";
			Preorder(node->left);
			Preorder(node->right);
		}
	}
	void Posetorder(BRTreeNode*node)
	{
		if(node!=nil)
		{
			Posetorder(node->left);
			Posetorder(node->right);
			cout<<node->key<<" ";
		}
	}
	//层次法打印树
void DispTree(BRTreeNode*BT)
{
    BRTreeNode stack[maxSize],p;
    int level[maxSize][2],top,n,i,width=4;
    if(BT!=NULL)
    {
        cout<<"Display a tree by hollow means."<<endl;
        top=1;
        stack[top]=BT;//push root point to stack.
        level[top][0]=width;
        while(top>0)
        {
            p=stack[top];
            n=level[top][0];
            for(i=1;i<=n;i++)
                cout<<" ";
            //输出信息
            if(p.key==0)
            {
                cout<<")";
            }
            else{
            if(p.key==-1) cout<<"Nil";
            else if(p.left&&p.right) cout<<"("<<p.key;
            else cout<<p.key;
            if(p.Getcolor()) cout<<"R,";
            else cout<<"B,";
            }
            for(i=n+1;i<maxWidth;i+=2)
                cout<<"--";
            cout<<endl;
            top--;
            if(p.right!=NULL)
            {
                //插入一个括号节点,key值为0
                top++;
                BRTreeNode* tmp=new BRTreeNode();
                tmp->key=0;
                stack[top]=tmp;
                level[top][0]=n+width;
                level[top][1]=2;
                top++;
                stack[top]=p.right;
                level[top][0]=n+width;
                level[top][1]=2;

            }
            if(p.left!=NULL)
            {
                top++;
                stack[top]=p.left;
                level[top][0]=n+width;
                level[top][1]=1;
            }
        }
    }
}
	//左旋节点node
	bool LeftRotate(BRTreeNode* node)
	{
		BRTreeNode*y;
		if(node->right==nil)
		{
			cout<<"can't left rotate!"<<endl;
			return 0;
		}
		y=node->right;
		node->right=y->left;
		if(y->left!=nil)
		{
			y->left->parent=node;
		}
		y->parent=node->parent;
		if(node->parent==nil)
		{
			root=y;
		}
		else if(node->parent->left==node)
		{
			node->parent->left=y;
		}
		else
		{
			node->parent->right=y;
		}
		y->left=node;
		node->parent=y;
		return 1;
	}
	//右旋节点
	bool RightRotate(BRTreeNode* node)
	{
		if(node->left==nil)
		{
			cout<<"can't rightrotate!"<<endl;
			return 0;
		}
		BRTreeNode* x;
		x=node->left;
		node->left=x->right;
		if(x->right!=nil)
		{
			x->right->parent=node;
		}
		x->parent=node->parent;
		if(node->parent==nil)
		{
			root=x;
		}
		else if(node->parent->left==node)
		{
			node->parent->left=x;
		}
		else
		{
			node->parent->right=x;
		}
		node->parent=x;
		x->right=node;
		return 1;
	}
	void Insert(int num)
	{
		BRTreeNode* node=new BRTreeNode(num,1);
		node->left=nil;
		node->right=nil;
		node->parent=nil;
		BRTreeNode* p=root,*q=nil;
		if(root==nil)
		{
			node->color=0;
			root=node;
			root->left=root->right=root->parent=nil;
			return ;
		}
		while(p!=nil)
		{
			if(p->key==num)
			{
				cout<<num<<"  has exist!"<<endl;
				return ;
			}
			else if(p->key>num)
			{
				q=p;
				p=p->left;
			}
			else
			{
				q=p;
				p=p->right;
			}
		}
		if(q->key>num)
		{
			q->left=node;
			node->parent=q;
		}
		else
		{
			q->right=node;
			node->parent=q;
		}
		RBInsertAdjust(node);
	}
	void RBInsertAdjust(BRTreeNode* node)
	{
		BRTreeNode* y;
		while(node->parent->color==1)
		{
			if(node->parent==node->parent->parent->left)
			{
				y=node->parent->parent->right;
				if(y->color==1)
				{
					node->parent->color=0;
					y->color=0;
					y->parent->color=1;
					node=node->parent->parent;
				}
				//此时y的颜色是黑色
				else
				{
					//第二种情况
					if(node==node->parent->right)
					{
						node=node->parent;
						LeftRotate(node);
					}
					//第三种情况
					node->parent->color=0;
					node->parent->parent->color=1;
					RightRotate(node->parent->parent);
				}
			}
			else
			{
				y=node->parent->parent->left;
				if(y->color==1)
				{
					node->parent->color=0;
					y->color=0;
					y->parent->color=1;
					node=node->parent->parent;
				}
				else
				{
					if(node==node->parent->left)
					{
						node=node->parent;
						RightRotate(node);
					}
					node->parent->color=0;
					node->parent->parent->color=1;
					LeftRotate(node->parent->parent);
				}
			}
		}
		root->color=0;
	}
	BRTreeNode* Search(int num)
	{
		BRTreeNode* p=root;
		while(p!=nil)
		{
			if(p->key==num)
			{
				return p;
			}
			else if(p->key>num)
			{
				p=p->left;
			}
			else
			{
				p=p->right;
			}
		}
		cout<<"there is no "<<num<<" in this tree!"<<endl;
		return nil;
	}
	//获取以node节点为根节点的树的最小元素,并返回该最小值
	int Minnum(BRTreeNode*node)
	{
		BRTreeNode*p=node;
		while(p->left!=nil)
		{
			p=p->left;
		}
		return p->key;
	}
	//获取以node节点为根节点的树的最da元素,并返回该最da值
	int Maxnum(BRTreeNode*node)
	{
		BRTreeNode*p=node;
		while(p->right!=nil)
		{
			p=p->right;
		}
		return p->key;
	}
	//获取以node节点为根节点的树的最小元素,并返回该节点
	BRTreeNode* MinNum(BRTreeNode*node)
	{
		BRTreeNode*p=node;
		while(p->left!=nil)
		{
			p=p->left;
		}
		return p;
	}
	//获取以node节点为根节点的树的最大元素
	BRTreeNode* MaxNum(BRTreeNode*node)
	{
		BRTreeNode*p=node;
		while(p->right!=nil)
		{
			p=p->right;
		}
		return p;
	}
	BRTreeNode*InorderSuccessor(BRTreeNode*node)
	{
		if(node->right!=nil)
		{
			return MinNum(node->right);
		}
		else
		{
			BRTreeNode*p=GetParent(node);
			while(p&&node==p->right)
			{
				node=p;
				p=GetParent(node);
			}
			return p;
		}
	}
	//中序遍历的前趋
	BRTreeNode*InordePredecessor(BRTreeNode*node)
	{
		if(node->left!=nil)
		{
			return MaxNum(node->left);
		}
		else
		{
			BRTreeNode*p=GetParent(node);
			while(p&&node==p->left)
			{
				node=p;
				p=GetParent(node);
			}
			return p;
		}
	}
	bool Delete(int num)
	{
		BRTreeNode*z,*y,*x;
        //寻找key值为num的节点p
        z=Search(num);
		//如果没有该节点则返回0
        if(z==nil)
        {
            return 0;
        }
		if(z->left==nil||z->right==nil)
		{
			y=z;
		}
		else
			y=InorderSuccessor(z);
		if(y->left!=nil)
			x=y->left;
		else
			x=y->right;
		x->parent=y->parent;
		if(x->parent==nil)
			root=x;
		else if(y=y->parent->left)
			y->parent->left=x;
		else
			y->parent->right=x;
		if(y!=z)
		{
			z->key=y->key;
		}
		if(y->color==0)
		{
			RBTreeFixup(x);
		}
		return 1;
	}
	void RBTreeFixup(BRTreeNode* x)
	{
		BRTreeNode*w;
		while(x!=root&&x->color==0)
		{
			if(x==x->parent->left)
			{
				w=x->parent->right;
				if(w->color==1)
				{
					w->color=0;
					x->parent->color=1;
					LeftRotate(x->parent);
					w=x->parent->right;
				}
				if(w->left->color==0&&w->right->color==0)
				{
					w->color=1;
					x=x->parent;
				}
				else
				{
					if(w->right->color==0)
					{
						w->color=1;
						RightRotate(w);
						w=x->parent->right;
					}
					w->color=x->parent->color;
					x->parent->color=0;
					w->right->color=0;
					LeftRotate(x->parent);
					x=root;
				}
			}
			else
			{
				w=x->parent->left;
				if(w->color==1)
				{
					w->color=0;
					x->parent->color=1;
					RightRotate(x->parent);
					w=x->parent->left;
				}
				if(w->right->color==0&&w->left->color==0)
				{
					w->color=1;
					x=x->parent;
				}
				else
				{
					if(w->left->color==0)
					{
						w->color=1;
						LeftRotate(w);
						w=x->parent->left;
					}
					w->color=x->parent->color;
					x->parent->color=0;
					w->left->color=0;
					RightRotate(x->parent);
					x=root;
				}
			}
		}
		x->color=0;
	}
};

#endif // BRTREE_H_INCLUDED

测试程序

 

 

[cpp] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 14px">#include <iostream> 
  2. #include"BRTree.h"  
  3. #include "BRTreeNode.h"  
  4. usingnamespace std; 
  5.  
  6. int main() 
  7.     BRTree tree; 
  8.     cout<<"Insert 9 numbers:"<<endl; 
  9.     int a[9]={8,11,17,15,6,1,22,25,27}; 
  10.     int i; 
  11.     for(i=0;i<9;i++) 
  12.     { 
  13.         tree.Insert(a[i]); 
  14.     } 
  15.     tree.DispTree(tree.Getroot()); 
  16.     cout<<"Delete 11:"<<endl; 
  17.     tree.Delete(11); 
  18.     tree.DispTree(tree.Getroot()); 
  19.     cout << "blackHeight:" <<tree.GetBlackHeight(tree.Getroot())<<endl; 
  20.  
  21.     return 0; 
  22. }</SPAN> 

转载于:https://www.cnblogs.com/szgzwf/archive/2012/11/10/2764189.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值