⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 redblack.t

📁 几种常用的压缩算法 本程序包含以下功能: 1、 Arithmetic coding 2、 Huffman coding 3、 LZ77 coding 4、 LZ78 coding 5、 L
💻 T
字号:
// The RedBlack tree code was taken from free source in C language.// Unfortunately I lost the author`s name :(//// The code adopted to project and turned into C++ template// by Arkadi Kagan.//#ifndef __REDBLACK_H#define __REDBLACK_Htemplate <class T>class TRedBlack{private:	// Red-Black tree description	typedef enum { BLACK, RED } nodeColor;public:	struct Node	{		Node	*left;		// left child		Node	*right;		// right child		Node	*parent;	// parent		nodeColor color;	// node color (BLACK, RED)		T	data;		// data stored in node	};	Node sentinel;	Node *root;			// root of Red-Black tree	Node *NIL;public:	TRedBlack()	: NIL(&sentinel)	{		sentinel.left	= NIL;		sentinel.right	= NIL;		sentinel.parent	= 0;		sentinel.color	= BLACK;		sentinel.data	= 0;		root = NIL;	}	~TRedBlack()	{	}private:	////////////////////////////	//  rotate node x to left //	////////////////////////////	void rotateLeft(Node *x)	{		Node *y = x->right;		// establish x->right link		x->right = y->left;		if (y->left != NIL) y->left->parent = x;		// establish y->parent link		if (y != NIL) y->parent = x->parent;		if (x->parent) {			if (x == x->parent->left)				x->parent->left = y;			else				x->parent->right = y;		} else {			root = y;		}		// link x and y		y->left = x;		if (x != NIL) x->parent = y;	}	void rotateRight(Node *x)	{		//////////////////////////////		//  rotate node x to right  //		//////////////////////////////		Node *y = x->left;		// establish x->left link		x->left = y->right;		if (y->right != NIL) y->right->parent = x;		// establish y->parent link		if (y != NIL) y->parent = x->parent;		if (x->parent) {			if (x == x->parent->right)				x->parent->right = y;			else				x->parent->left = y;		} else {			root = y;		}		// link x and y		y->right = x;		if (x != NIL) x->parent = y;	}	void insertFixup(Node *x)	{		///////////////////////////////////////		//  maintain Red-Black tree balance  //		//  after inserting node x           //		///////////////////////////////////////		// check Red-Black properties		while (x != root && x->parent->color == RED) {			// we have a violation			if (x->parent == x->parent->parent->left) {				Node *y = x->parent->parent->right;				if (y->color == RED) {					// uncle is RED					x->parent->color = BLACK;					y->color = BLACK;					x->parent->parent->color = RED;					x = x->parent->parent;				} else {					// uncle is BLACK					if (x == x->parent->right) {						// make x a left child						x = x->parent;						rotateLeft(x);					}					// recolor and rotate					x->parent->color = BLACK;					x->parent->parent->color = RED;					rotateRight(x->parent->parent);				}			} else {				// mirror image of above code				Node *y = x->parent->parent->left;				if (y->color == RED) {					// uncle is RED					x->parent->color = BLACK;					y->color = BLACK;					x->parent->parent->color = RED;					x = x->parent->parent;				} else {					// uncle is BLACK					if (x == x->parent->left) {						x = x->parent;						rotateRight(x);					}					x->parent->color = BLACK;					x->parent->parent->color = RED;					rotateLeft(x->parent->parent);				}			}		}		root->color = BLACK;	}public:	Node *insertNode(T data)	{		Node *current, *parent, *x;		/////////////////////////////////////////////////		//  allocate node for data and insert in tree  //		/////////////////////////////////////////////////		// find where node belongs		current = root;		parent = 0;		while (current != NIL) {			if (compEQ(data, current->data)) return (current);			parent = current;			current = compLT(data, current->data) ?				current->left : current->right;		}		// setup new node		if ((x = new Node) == 0)			FatalError ("insufficient memory (insertNode)\n");		x->data = data;		x->parent = parent;		x->left = NIL;		x->right = NIL;		x->color = RED;		// insert node in tree		if(parent) {			if(compLT(data, parent->data))				parent->left = x;			else				parent->right = x;		} else {			root = x;		}		insertFixup(x);		return(x);	}	void deleteFixup(Node *x)	{		///////////////////////////////////////		//  maintain Red-Black tree balance  //		//  after deleting node x            //		///////////////////////////////////////		while (x != root && x->color == BLACK) {			if (x == x->parent->left) {				Node *w = x->parent->right;				if (w->color == RED) {					w->color = BLACK;					x->parent->color = RED;					rotateLeft (x->parent);					w = x->parent->right;				}				if (w->left->color == BLACK && w->right->color == BLACK) {					w->color = RED;					x = x->parent;				} else {					if (w->right->color == BLACK) {						w->left->color = BLACK;						w->color = RED;						rotateRight (w);						w = x->parent->right;					}					w->color = x->parent->color;					x->parent->color = BLACK;					w->right->color = BLACK;					rotateLeft (x->parent);					x = root;				}			} else {				Node *w = x->parent->left;				if (w->color == RED) {					w->color = BLACK;					x->parent->color = RED;					rotateRight (x->parent);					w = x->parent->left;				}				if (w->right->color == BLACK && w->left->color == BLACK) {					w->color = RED;					x = x->parent;				} else {					if (w->left->color == BLACK) {						w->right->color = BLACK;						w->color = RED;						rotateLeft (w);						w = x->parent->left;					}					w->color = x->parent->color;					x->parent->color = BLACK;					w->left->color = BLACK;					rotateRight (x->parent);					x = root;				}			}		}		x->color = BLACK;	}	void deleteNode(Node *z)	{		///////////////////////////////		//  delete node z from tree  //		///////////////////////////////		Node *x, *y;		if (!z || z == NIL) return;		if (z->left == NIL || z->right == NIL) {			// y has a NIL node as a child			y = z;		} else {			// find tree successor with a NIL node as a child			y = z->right;			while (y->left != NIL) y = y->left;		}		// x is y's only child		if (y->left != NIL)			x = y->left;		else			x = y->right;		// remove y from the parent chain		x->parent = y->parent;		if (y->parent)			if (y == y->parent->left)				y->parent->left = x;			else				y->parent->right = x;		else			root = x;		if (y != z) z->data = y->data;		if (y->color == BLACK)			deleteFixup (x);		delete y;	}	Node *findNode(T data)	{		/////////////////////////////////		//  find node containing data  //		/////////////////////////////////		Node *current = root;		while(current != NIL)			if(compEQ(data, current->data))				return (current);			else				current = compLT (data, current->data) ?					current->left : current->right;		return(0);	}};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -