1. 程式人生 > >c++實現紅黑樹

c++實現紅黑樹

現在只是簡單的實現了紅黑樹的調整功能,其餘功能還沒有實現好,等後面的學習中再來新增

#ifndef _RB_TREE_H_
#define _RB_TREE_H_

typedef bool _color_type;
const _color_type _color_red_ = false;
const _color_type _color_black_ = true;

template <class T>
struct RB_Tree_node{
public:
	_color_type color;	
	T key;
	BR_Tree_node *left;
	BR_Tree_node *right;
	BR_Tree_node *parent;

	RB_Tree_node(){}
	RB_Tree_node(_color_type _color,T _key,BR_Tree_node *_left,BR_Tree_node* _right,BR_Tree_node8 _parent);color(_color),key(_key),left(_left),right(_right),parenr(_parent){}
};

template <class T>
struct RB_tree{
private:
	RB_Tree_node *header;
	RB_Tree_node *root;

};
/*
*這裡的左旋和右旋操作和AVL基本相似,但是還要維護x節點的父親節點以及每個節點的parent指標
*/
template<class T>
void __re_tree_rotate_left(RB_Tree_node* x,RB_Tree_node* &root){
	RB_Tree_node* y = x->right;
	x->right = y->left;
	if(y->left != 0)
		y->left->parent = x;
	y->parent = x->parent;
	
	if(x == root)
		root = y;
	else if(x == x->parent->left)
		x->parent->left = y;
	else
		x->parent->right = y;

	y->left = x;
	x->parent = y;
}

template<class T>
void __re_tree_rotate_right(RB_Tree_node* x,RB_Tree_node* &root){
	RB_Tree_node* y = x->left;
	x->left  = y->right;
	if(y->right != 0)
		y->right->parent = x;
	y->parent = x->parent;

	if(x == root) //更新x的parent指向x節點                根節點的parent為header
		root = y;
	else if(x == x->parnt->left)//判斷為x的右節點
		x->parnet->left = y;
	else
		x->parent->right = y;

	y->left = x;
	x->parent = y;
}

template<class T>
void __rb_tree_rebalance(RB_Tree_node *x, RB_Tree_node* &root)   //RB樹的平衡的調整    
{
	x->color = _color_red_; //首先將新節點的顏色設定為紅色,新節點必須為紅色
	while(x != root && x->parent->color == _color_red_){ //父親節為紅色,並且當前節點不為根結點    因為只有當父親節點也為紅色的時候才會出現錯誤,並且後面不斷返回的x節點一直會為紅色 
		if(x->parent == x->parent->parent->left){//父親節點為祖父節點之左子節點
			RB_Tree_node* y = x->parent->parent->right; //設定y為伯父節點
			if(y->color == _color_red_){//伯父節點存在並且伯父節點為紅色 (滿足父親節點和伯父節點都為紅色的情況,那麼將父親節點和伯父節點變為黑色,曾祖父節點更改為紅色)
				y->color = _color_black_;
				x->parent->color = _color_black_;
				x->parent->parent->color = _color_red_;
				x = x->parent->parent;//將x設定為曾曾祖父,繼續向上傳遞,檢視是否含有上述情況
			}
			else{ //無伯父節點,或者伯父節點為黑色(預設沒有節點就是黑色)       也就是出現錯誤,需要我們的調整
				if(x == x->parent->right){//如果新節點為父親節點之右子節點
					x = x->parent;
					__re_tree_rotate_left(x,root);
				}
				x->parent->parent->color = _color_red_;//更改顏色
				x->parent->color = _color_black_;
				__rb_tree_rotate_right(x->parent->parent,root);
				
			}
		}
		else{ //父親節點為祖父節點右子節點
			RB_Tree_node* y = x->parent->parent->left;//y為伯父節點
			if(y->color == _color_red_){ //伯父節點為紅色
				y->color = _color_black_;
				x->parent->color = _color_black_;
				x->parent->parent->color = _color_red_;
				x = x->parent->parent; //準備繼續向上檢查,將x設定為祖父節點
			}
			else{  //伯父節點不存在或者為黑色,也就是出現錯誤,需要我們的調整!!
				if(x == x->parent->left){ //如果新節點為父親節點的左側節點
					x = x->parent;
					__rb__tree_rotate_right(x,root);//右旋操作
				}
				x->parent->parent->color = _color_red_; //修改顏色,繼續左旋
				x->parent->color = _color_black_;
				__rb_tree_rotate_left(x->parent->parent,root);

			}
		}
	}
	root->color = _color_black_;  //可能會出現修改根節點顏色的情況,可以將根節點直接修改為黑色,不影響RB樹的正確性
}
	 
#endif