《算法导论》学习笔记(4)——红黑树(c++语言实现)
来源:互联网 发布:手机截图编辑软件 编辑:程序博客网 时间:2024/06/08 14:37
这是c++实现的红黑树,主要思路跟前一篇c语言的一样,主要是设计方式的不同,通过这两篇博客也能比较一下面向过程和面向对象之间的区别与联系。
本例单独5个函数:
Node.h
#ifndef NODE_H_#define NODE_H_typedef int EleType;//定义红黑树结点颜色颜色类型enum Color { RED, BLACK };class Node{public:Node(); //默认构造函数Node( Node* p, Node* l, Node* r, EleType k, Color c );Node* getParent();void setParent( Node* x );Node* getLeft();void setLeft( Node* x );Node* getRight();void setRight( Node* x );EleType getKey();void setKey( EleType k );Color getColor();void setColor( Color c );private:Node *parent;Node *left;Node *right;EleType key;Color color;};#endif /* NODE_H_ */
Node.cpp
#include <iostream>#include "Node.h"Node::Node():parent(NULL), left(NULL), right(NULL), key(0), color(BLACK){}Node::Node( Node* p, Node* l, Node* r, EleType k, Color c ) :parent(p), left(l), right(r), key(k), color(c){}Node* Node::getParent(){return parent;}void Node::setParent( Node* x ){parent = x;}Node* Node::getLeft(){return left;}void Node::setLeft( Node* x ){left = x;}Node* Node::getRight(){return right;}void Node::setRight( Node* x ){right = x;}EleType Node::getKey(){return key;}void Node::setKey( EleType k ){key = k;}Color Node::getColor(){return color;}void Node::setColor( Color x ){color = x;}
RBTree.h
#ifndef RBTREE_H_#define RBTREE_H_#include "Node.h"class RBTree{public:RBTree();~RBTree();void rb_insert( EleType k );void rb_delete( EleType k );void rb_display();private:Node* root;Node* nil;Node* rb_createNode( EleType key ); //构造一个结点,值为keyvoid rb_search( EleType key ); //查找值为key的结点Node* rb_search( Node* r, EleType key ); //递归查找值为key的结点Node* rb_maximum( Node* x ); //给定结点为根的子树中的最大结点Node* rb_minimum( Node* x ); //给定结点为根的子树中的最小结点Node* rb_successor( Node* x ); //后继结点void left_rotate( Node* x ); //左旋void right_rotate( Node* x ); //右旋void rb_insertFixup( Node* x ); //插入结点后的调整void rb_deleteFixup( Node* x ); //删除结点后的调整void rb_display( Node* x ); //打印整棵红黑树,递归实现};#endif /* RBTREE_H_ */
RBTree.cpp
#include <iostream>#include "RBTree.h"using namespace std;RBTree::RBTree(){nil = new Node();nil->setParent( nil );nil->setLeft( nil );nil->setRight( nil );nil->setKey( 0 );nil->setColor( BLACK );root = nil;}Node* RBTree::rb_createNode( int key ){Node* node = new Node();node->setParent( nil );node->setLeft( nil );node->setRight( nil );node->setKey( key );node->setColor( RED );return node;}void RBTree::rb_display(){rb_display( root ); //递归调用带参数的函数rb_display()cout << endl;}void RBTree::rb_display( Node* x ){if( x != nil ){rb_display( x->getLeft() );cout << x->getKey() << " ,color is ";if( x->getColor() )cout << "BLACK" << endl;elsecout << "RED" << endl;rb_display( x->getRight() );}}Node* RBTree::rb_search( Node* r, int key ){if( (r == nil) || (r->getKey() == key) )return r;if( key < r->getKey() )return rb_search( r->getLeft(), key );elsereturn rb_search( r->getRight(), key );}Node* RBTree::rb_maximum( Node* x ){if( x->getRight() == nil )return x;elsereturn rb_maximum( x->getRight() );}Node* RBTree::rb_minimum( Node* x ){if( x->getLeft() == nil )return x;elsereturn rb_minimum( x->getLeft() );}Node* RBTree::rb_successor( Node* x ){if( x->getRight() != nil )return rb_minimum( x->getRight() );Node* y = x->getParent();while( ( y!=nil ) && ( x==y->getRight() ) ){x = y;y->setParent( y );}return y;}void RBTree::left_rotate( Node* x ){Node* y;if( x->getRight() == nil ){ cout << "have no right child,rotation cancel." << endl; return;}y = x->getRight();x->setRight( y->getLeft() );if( y->getLeft() != nil )y->getLeft()->setParent( x );y->setParent( x->getParent() );if( x->getParent() == nil )root = y;else if( x == x->getParent()->getLeft() )x->getParent()->setLeft( y );elsex->getParent()->setRight( y );y->setLeft( x );x->setParent( y );}void RBTree::right_rotate( Node* x ){Node* y;if( x->getLeft() == nil ){ cout << "have no left child,rotation cancel." << endl; return;}y = x->getLeft();x->setLeft( y->getRight() );if( y->getRight() != nil )y->getRight()->setParent( x );y->setParent( x->getParent() );if( x->getParent() == nil )root = y;else if( x == x->getParent()->getLeft() )x->getParent()->setLeft( y );elsex->getParent()->setRight( y );y->setRight( x );x->setParent( y );}void RBTree::rb_insert( EleType key ){Node* y = nil;Node* x = root;Node* z = rb_createNode( key );z->setKey( key );while( x != nil ){y = x;if ( key < x->getKey() )x = x->getLeft();elsex = x->getRight();}z->setParent( y );if ( y == nil )root = z;else if ( z->getKey() < y->getKey() )y->setLeft( z );elsey->setRight( z );z->setLeft( root->getParent() );z->setRight( root->getParent() );z->setColor( RED );rb_insertFixup( z );}void RBTree::rb_insertFixup( Node* z ){while( z->getParent()->getColor() == RED ){if( z->getParent() == z->getParent()->getParent()->getLeft() ){Node* y = z->getParent()->getParent()->getRight();if( y->getColor() == RED ){z->getParent()->setColor( BLACK );y->setColor( BLACK );z->getParent()->getParent()->setColor( RED );z = z->getParent()->getParent();}else{if( z == z->getParent()->getRight() ){z = z->getParent();left_rotate( z );}z->getParent()->setColor( BLACK );z->getParent()->getParent()->setColor( RED );right_rotate( z->getParent()->getParent() );}}else{Node* y = z->getParent()->getParent()->getLeft();if( y->getColor() == RED ){z->getParent()->setColor( BLACK );y->setColor( BLACK );z->getParent()->getParent()->setColor( RED );z = z->getParent()->getParent();}else{if( z == z->getParent()->getLeft() ){z = z->getParent();right_rotate( z );}z->getParent()->setColor( BLACK );z->getParent()->getParent()->setColor( RED );left_rotate( z->getParent()->getParent() );}}}root->setColor( BLACK );}void RBTree::rb_delete( EleType key ){Node* z = rb_search( root, key ); //要删除值所在结点if( z == nil ){cout << "Not in the tree" << endl;return;}else{Node* x = nil; //删除结点的子结点Node* y = nil; //删除的结点if( (z->getLeft() == nil) || (z->getRight() == nil) )y = z;elsey = rb_successor( z );if ( y->getLeft() != nil )x = y->getLeft();elsex = y->getRight();x->setParent( y->getParent() );if ( y->getParent() == nil )root = x;else if ( y == x->getParent()->getLeft() )y->getParent()->setLeft( x );elsey->getParent()->setRight( x );if( y != z )z->setKey( y->getKey() );if( y->getColor() == BLACK )rb_deleteFixup( x );delete y;}}void RBTree::rb_deleteFixup( Node* x ){Node* w;while ( (x != root) && (x->getColor() == BLACK) ){if ( x == x->getParent()->getLeft() ){w = x->getParent()->getRight();if (w->getColor() == RED){w->setColor( BLACK );x->getParent()->setColor( RED );left_rotate( x->getParent() );w = x->getParent()->getRight();}if ( (w->getLeft()->getColor() == BLACK) && (w->getRight()->getColor() == BLACK) ){w->setColor( RED );x = x->getParent();}else{if ( w->getRight()->getColor() == BLACK ){w->getLeft()->setColor( BLACK );w->setColor( RED );right_rotate( w );w = x->getParent()->getRight();}w->setColor( x->getParent()->getColor() );x->getParent()->setColor( BLACK );w->getRight()->setColor( BLACK );left_rotate( x->getParent() );x = root;}}else{w = x->getParent()->getLeft();if ( w->getColor() == RED ){w->setColor( BLACK );x->getParent()->setColor( RED );right_rotate( x->getParent() );w = x->getParent()->getRight();}if( (w->getRight()->getColor() == BLACK) && (w->getLeft()->getColor() == BLACK) ){w->setColor( RED );x = x->getParent();}else{if( w->getLeft()->getColor() == BLACK ){w->getRight()->setColor( BLACK );w->setColor( RED );left_rotate( w );w = x->getParent()->getLeft();}w->setColor( x->getParent()->getColor() );x->getParent()->setColor( BLACK );w->getLeft()->setColor( BLACK );right_rotate( x->getParent() );x = root;}}}x->setColor( BLACK );}RBTree::~RBTree(){delete nil;delete root;}
main.cpp
#include <iostream>#include "RBTree.h"int main(){RBTree rbtree;rbtree.rb_insert( 12 );rbtree.rb_insert( 1 );rbtree.rb_insert( 9 );rbtree.rb_insert( 2 );rbtree.rb_insert( -10 );rbtree.rb_display();rbtree.rb_delete( 2 );rbtree.rb_display();rbtree.rb_delete( 10 );rbtree.rb_display();return 0;}
0 0
- 《算法导论》学习笔记(4)——红黑树(c语言实现)
- 《算法导论》学习笔记(4)——红黑树(c语言实现)
- 《算法导论》学习笔记(4)——红黑树(c++语言实现)
- 《算法导论》学习笔记(4)——红黑树
- 读《算法导论》我来C语言实现(4)——快速排序
- 算法导论学习---红黑树详解之插入(C语言实现)
- 算法导论——关于快速排序的实现(c语言实现)
- 算法导论学习笔记(4)——利用链接法实现哈希表
- 算法导论学习笔记(6)——红黑树
- 读《算法导论》我来C语言实现(1)——插入排序
- 读《算法导论》我来C语言实现(2)——合并排序
- 《算法导论》动态规划—最长公共子序列(不连续)--c语言实现
- 算法导论学习笔记(18)——单源最短路径(Dijkstra算法实现)
- 算法导论:堆排序递归实现 (c语言)
- 算法导论:堆排序非递归实现(c语言)
- 算法导论学习笔记—Strassen算法的Java实现
- 算法导论学习笔记——红黑树
- 算法导论学习笔记(九):红黑树
- Java动态数组的用法详解
- 【公告】博客数据异常已全部恢复
- HDU2062题解 01背包而已
- codeigniter源代码分析之路由处理类 Router.php
- 希尔排序 原理及实现
- 《算法导论》学习笔记(4)——红黑树(c++语言实现)
- Lesson_for_java_day17--java中的IO流(IO基本流、键盘输入、管道流、文件及文件夹操作、Properties类、切割文件、记录软件运行次数)
- Ffmpeg移植S3C2440
- Java中字符串在不同字符编码中所占字节数
- lua数学库
- 继承的使用
- 琐碎资料收集整理
- 读取clob格式文件
- Jquery+Json+struts交互demo,以及为什么要配置includeProperties,root