算法导论-红黑树C++实现
来源:互联网 发布:体育废 知乎 编辑:程序博客网 时间:2024/05/01 19:09
红黑树的定义:
一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树:
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; } } }}//左旋节点nodebool 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;}elsey=InorderSuccessor(z);if(y->left!=nil)x=y->left;elsex=y->right;x->parent=y->parent;if(x->parent==nil)root=x;else if(y=y->parent->left)y->parent->left=x;elsey->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;}
参考:
教你透彻了解红黑树-http://blog.csdn.net/v_JULY_v/article/details/6105630
- 算法导论红黑树实现
- 算法导论C语言实现: 算法基础
- kmp算法实现-算法导论C语言版
- 算法导论学习---红黑树详解之插入(C语言实现)
- 《算法导论》中红黑树的C语言实现
- 堆排序C语言实现 算法导论
- 算法导论C语言实现: 堆排序
- 算法导论C语言实现: 快速排序
- 算法导论C语言实现: 计数排序
- 算法导论C语言实现: 基本数据结构
- 【算法导论】归并排序,C语言实现
- 算法导论 堆排序 C语言实现
- 算法导论,合并排序,c实现。
- 算法导论,堆排序,c实现。
- 算法导论快排实现(C++)
- 算法导论计数排序实现(C++)
- 算法导论-红黑树C++实现
- 算法导论红黑树C++实现
- Oracle的to_date函数(SQL语句往Oracle数据库中插入日期型数据)
- Flex+BlazeDS+Spring+Java+Tomcat整合开发时报404错误
- 用口诀背单词 - 1
- Java中的transient,volatile和strictfp关键字
- 闭包中使用this
- 算法导论-红黑树C++实现
- 推荐系统的循序进阶读物(从入门到精通)
- JS中数组的定义及相关方法
- 一个游戏程序员的学习资料
- Linux上强制SSH工具使用指定的private key
- java 使用properties文件配置动态信息
- 【转】Crontab使用说明
- 用口诀背单词 - 2
- 内存管理 - Windows内存管理