红黑树C++实现
2013-02-27 19:07
246 查看
红黑树的定义:
一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树:
1)每个节点或是红的,或是黑的。
2)根节点是黑的。
3)每个叶节点(NIL)是黑节点。
4)如果一个节点是红的,则它的两个儿子都是黑的。
5)对每个节点,从该节点到其子孙节点的所有路径上包含相同节点数目的黑节点。
C++代码实现:
BRTreeNode.h
BRTree.h
测试程序
注:转载源地址
一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树:
1)每个节点或是红的,或是黑的。
2)根节点是黑的。
3)每个叶节点(NIL)是黑节点。
4)如果一个节点是红的,则它的两个儿子都是黑的。
5)对每个节点,从该节点到其子孙节点的所有路径上包含相同节点数目的黑节点。
C++代码实现:
BRTreeNode.h
#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
#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
测试程序
#include <iostream> #include"BRTree.h" #include "BRTreeNode.h" using namespace std; int main() { BRTree tree; cout<<"Insert 9 numbers:"<<endl; int a[9]={8,11,17,15,6,1,22,25,27}; int i; for(i=0;i<9;i++) { tree.Insert(a[i]); } tree.DispTree(tree.Getroot()); cout<<"Delete 11:"<<endl; tree.Delete(11); tree.DispTree(tree.Getroot()); cout << "blackHeight:" <<tree.GetBlackHeight(tree.Getroot())<<endl; return 0; }
注:转载源地址