亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? rbtree.cpp

?? 紅黑樹是一種自平衡二叉查找樹
?? CPP
字號:
template <typename Type>
struct TreeNode
{
	Type key;
	int color; 
	TreeNode *parent,*left,*right;
};

template <typename Type>
class RBTree
{
private:
	enum
	{
		RED,BLACK
	}Color;
	Type key;
	int color; 
	TreeNode<Type> *parent,*left,*right;
	TreeNode<Type> *NIL;
	TreeNode<Type> *ROOT;
	void left_rotate(TreeNode<Type> *&rotate);
	void right_rotate(TreeNode<Type> *&rotate);
	void RB_insert_fixup(TreeNode<Type>* &node);
	void RB_delete_fixup(TreeNode<Type>* &node);
public:
	//const static TreeNode<Type>* nil;
	RBTree();
	TreeNode<Type> *successor(const TreeNode<Type> *node);
	TreeNode<Type>* insert(Type key);
	TreeNode<Type>* search(Type key);
	TreeNode<Type>* remove(Type key);
	TreeNode<Type> *maxnum(TreeNode<Type>*node);
	TreeNode<Type>* minnum(TreeNode<Type>*node);
	TreeNode<Type>* getRoot();
	void inorder(TreeNode<Type>*node);
	void test()
	{
		this->insert(1);
		this->insert(2);
		left_rotate(ROOT);
	}
	~RBTree();
};
//template <typename Type>
//const  TreeNode<Type>* RBTree<Type>::nil=NIL;
template <typename Type>
RBTree<Type>::RBTree()
{
	NIL=new TreeNode<Type>;
	NIL->color=BLACK;
	NIL->key=123456;
	NIL->left=0;
	NIL->right=0;
	NIL->parent=0;
	ROOT=NIL;
}
template<typename Type>
RBTree<Type>::~RBTree()
{
	delete NIL;
}
template<typename Type>
TreeNode<Type>* RBTree<Type>::maxnum(TreeNode<Type>*node)
{
	//如果是空樹
	if (node == NULL)
	{
		return NULL;
	}

	TreeNode<Type> *max=node;
	while(max->right!=NIL)
		max=max->right;
	return max;
}
template<typename Type>
TreeNode<Type>*  RBTree<Type>::minnum(TreeNode<Type>*node)
{
	//如果是空樹
	if (node == NULL)
	{
		return NULL;
	}

	TreeNode<Type> *min=node;
	while(min->left!=NIL)
		min=min->left;
	return min;
}
template<typename Type>
TreeNode<Type>* RBTree<Type>::successor(const TreeNode<Type>* node)
{
	if(node->right!=NIL)
		return minnum(node->right);

	const TreeNode<Type>*s=node;
	const TreeNode<Type>*p=s->parent;
	while( p!=NIL && s==p->right )
	{
		s=p;p=s->parent;
	}
	return const_cast<TreeNode<Type>*>(p);
}
template<typename Type>
TreeNode<Type>* RBTree<Type>::getRoot()
{
	TreeNode<Type>*root=ROOT;
	return root;
}
template<typename Type>
void  RBTree<Type>::left_rotate(TreeNode<Type>*& _rotate)
{
	if(_rotate->right==NIL){cout<<"沒有右孩子,不能左旋";return ;}//right child is nil, so can not left rotate
	TreeNode<Type>* r = _rotate->right;
	TreeNode<Type>*t,*rotate=_rotate;
	//deal with r->left
	rotate->right=r->left;
	r->left->parent=rotate;

	//deal with r
	// t=rotate->parent;
	// r->parent=t;//rotate 被修改成了NIL 為什么?
	// rotate=rotate->parent;
	if(rotate->parent==NIL)
	{
		ROOT=r;
		r->parent=NIL;
	}
	else if(rotate==rotate->parent->left)
		rotate->parent->left=r;
	else
		rotate->parent->right=r;
	r->parent=rotate->parent;
	//deal with rotate
	rotate->parent=r;
	r->left=rotate;
}
template<typename Type>
void  RBTree<Type>::right_rotate(TreeNode<Type>* &_rotate)
{
	TreeNode<Type>*rotate=_rotate;//不知道為什么,如果直接對_rotate操作,在過程中會改變_rotate得值
	if(rotate->left==NIL)
		return ;//left child is NIL, so can not right rotate
	TreeNode<Type>* l = rotate->left;
	//deal with l->right
	//cout<<"key"<<rotate->parent->key<<endl;
	l->right->parent=rotate;
	rotate->left=l->right;
	//deal with l
	l->parent=rotate->parent;
	if(rotate->parent==NIL)
	{
		ROOT=l;
		l->parent=NIL;
	}
	else if(rotate==rotate->parent->left)
		rotate->parent->left=l;
	else
		rotate->parent->right=l;
	//deal with rotate
	rotate->parent=l;
	l->right=rotate;
}
template<typename Type>
TreeNode<Type>* RBTree<Type>::insert(Type key)
{
	TreeNode<Type> *node=new TreeNode<Type>;
	TreeNode<Type> *down=ROOT;
	TreeNode<Type> *s=NIL;
	while(down!=NIL)
	{
		s=down;
		if(key<down->key)
			down=down->left;
		else
			down=down->right;
	}//找到合適位置
	node->parent=s;
	if(s==NIL)
	{
		ROOT=node;
		node->parent=NIL;
	}
	else if(key<s->key)
		s->left=node;
	else
		s->right=node;
	node->key=key;
	node->left=NIL;
	node->right=NIL;
	node->color=RED;
	RB_insert_fixup(node);
	return node;
}
template<typename Type>
void RBTree<Type>::RB_insert_fixup(TreeNode<Type>*& change)
{
	// TreeNode<Type>*change=node;
	TreeNode<Type>*father;
	TreeNode<Type>*uncle;
	while(change->parent->color==RED)
	{
		father=change->parent;
		if(father==father->parent->left)
		{
			uncle=father->parent->right;//父節(jié)點的兄弟
			if(uncle->color==RED)//uncle同樣為red
			{
				father->color=BLACK;
				uncle->color=BLACK;
				father->parent->color=RED;
				change=father->parent;//進行循環(huán)
			}else 
			{
				//cout<<"uncle node color=black"<<endl;
				if(change==father->right)//內(nèi)插入,左旋
				{
					change=father;
					//cout<<"before rotate key:"<<change->key<<" color "<<change->color<<endl;
					left_rotate(change);
					father=change->parent;
					//cout<<"after rotate key:"<<change->key<<" color "<<change->color<<endl;
					// cout<<"內(nèi)插入"<<endl;
				}
				//外插入
				father->color=BLACK;
				father->parent->color=RED;//改變顏色
				// cout<<"before rotate key:"<<change->key<<" color "<<change->color<<endl;
				right_rotate(father->parent);
				// cout<<"before rotate key:"<<change->key<<" color "<<change->color<<endl;
			}
		}
		else
		{
			uncle=father->parent->left;//父節(jié)點的兄弟
			if(uncle->color==RED)//uncle同樣為red
			{
				father->color=BLACK;
				uncle->color=BLACK;
				father->parent->color=RED;
				change=father->parent;//進行循環(huán)
			}else
			{
				if(change==father->left)//內(nèi)插入
				{
					change=father;
					right_rotate(change);
					father=change->parent;
				}
				//外插入
				father->color=BLACK;
				father->parent->color=RED;
				left_rotate(father->parent);
			}
		}
	}
	ROOT->color=BLACK;
}
template<typename Type>
TreeNode<Type>* RBTree<Type>::search(Type key)
{
	TreeNode<Type> *p=ROOT;
	while(p!=NIL&&p->key!=key)
	{
		if(key<p->key)
			p=p->left;
		else
			p=p->right;
	}
	return p;
}
template<typename Type>
TreeNode<Type>* RBTree<Type>::remove(Type key)
{
	TreeNode<Type> *p = this->search(key);
	if(p==NIL)
		return p;
	//rn 為需要改變的節(jié)點,找到得key節(jié)點,如果只有一個孩子或者沒有孩子,則需要被刪除的就是該節(jié)點,否則(兩個孩子)
	//需要刪除的是直接后繼節(jié)點(首先將key節(jié)點用后繼節(jié)點代替)后繼節(jié)點沒有左孩子
	//最后rn最多只有一個孩子
	TreeNode<Type> *rn=NIL;
	TreeNode<Type> *act;
	if(p->left==NIL || p->right==NIL)
		rn = p;
	else
		rn = this->successor(p);
	if(rn->left!=NIL)//如果被刪除的節(jié)點左孩子不空,則使用act紀錄(key節(jié)點只有左孩子的情況)
		act=rn->left;
	else//act紀錄key沒有孩子,有右孩子,雙子情況
		act=rn->right;

	act->parent=rn->parent;//更新父節(jié)點
	if(rn->parent==NIL)
		ROOT=act;//已經(jīng)將act得parent修改成NIL了
	else if(rn == rn->parent->left)
		rn->parent->left=act;
	else
		rn->parent->right=act;
	if(rn!=p)//key有兩個孩子時,實際刪除的是p的直接后繼rn節(jié)點,所以需要將后繼節(jié)點的信息復制key節(jié)點中
		p->key=rn->key;
	if(rn->color==BLACK)
		RB_delete_fixup(act);
	return rn;
}
//刪除一個黑色節(jié)點后導致兩邊的bh不同。
template<typename Type>
void RBTree<Type>::RB_delete_fixup(TreeNode<Type> *&_node)
{
	TreeNode<Type>*father,*brother,*node;
	node=_node;
	father=node->parent;
	while(node!=ROOT&&node->color==BLACK)//如果color(x)為red,只需要講color(x)=black就行了
	{
		if(node=father->left)//color(node)=black,father左孩子得black nodes(m-1) =father右孩子的black nodes(m) -1
		{
			brother=father->right;
			if(brother->color==RED)//color(father)=black,********************case 1
			{
				brother->color=BLACK;
				father->color=RED;
				left_rotate(father);//修改了樹結(jié)構(gòu),這一步后brother為node得祖父節(jié)點并且brother右孩子的black nodes = m不變
				brother=parent->right;//修正node得兄弟節(jié)點,現(xiàn)在color(father)=black right(father)=black,并且father->left得
				//black nodes還為m-1,father->right得black nodes = m
			}
			//如果兄弟為黑,則根據(jù)兄弟的孩子來區(qū)分,color(Node)=black,color(brother)=black,color(father)未知
			if(brother->left->color==BLACK&&brother->right->color==BLACK)//********************case 2
			{
				brother->color=RED;//fater右孩子的black nodes = m-1
				node=father;//如果father為red,則循環(huán)結(jié)束,將father改為black,則整個以father為根的子樹左右孩子的black nodes都為m
			}
			else 
			{
				if(brother->right->color==BLACK)//右孩子為黑色********************case 3
				{
					brother->left->color=BLACK;
					brother->color=RED;
					right_rotate(brother);     
					brother=father->right;//brother的右孩子為red
				}
				//if(brother->right->color==RED)************************case 4
				father->color=BLACK;
				brother->right->color=BLACK;//red修改成black
				brother->color=father->color;
				//執(zhí)行旋轉(zhuǎn)后,brother為node得祖父,brother右孩子得black nodes=m,做孩子的black nodes=m(+father為黑色)
				left_rotate(father);
				node=ROOT;//結(jié)束
			}
		}
	}
	node->color=BLACK;
}
template<typename Type>
void RBTree<Type>::inorder(TreeNode<Type>*node)
{
	if(node!=NIL)
	{
		inorder(node->left);
		if(node->color==RED)
			if(node->left->color==RED||node->right->color==RED)
				cout<<"wrong"<<" ";
		cout<<node->key<<" ";
		inorder(node->right);
	}

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲自拍都市欧美小说| 国产精品一二三在| 91蝌蚪porny| 亚洲色图都市小说| 欧美在线短视频| 亚洲第一激情av| 在线播放91灌醉迷j高跟美女| 午夜精品久久久久久久蜜桃app| 欧美亚洲综合久久| 日产欧产美韩系列久久99| 精品国产免费人成电影在线观看四季| 韩国av一区二区三区在线观看| 久久久久久97三级| jlzzjlzz亚洲日本少妇| 一区二区激情小说| 日韩精品自拍偷拍| 成人av资源在线观看| 亚洲午夜影视影院在线观看| 日韩视频免费直播| 成人性生交大片免费看中文 | 天堂蜜桃91精品| 精品奇米国产一区二区三区| 国产精品中文有码| 亚洲精品中文在线影院| 精品国产污污免费网站入口| 99免费精品视频| 日本亚洲最大的色成网站www| 国产亚洲女人久久久久毛片| 91久久国产最好的精华液| 蜜臀av一级做a爰片久久| 中文字幕精品—区二区四季| 欧美日韩视频一区二区| 国产成人啪免费观看软件| 亚洲综合激情网| 久久精品综合网| 欧美日韩国产免费| thepron国产精品| 裸体健美xxxx欧美裸体表演| 亚洲手机成人高清视频| 精品福利一区二区三区免费视频| 91视频国产观看| 国产美女在线精品| 亚洲va国产va欧美va观看| 国产欧美综合在线| 日韩一本二本av| 精品视频一区二区三区免费| av欧美精品.com| 国产一区二区三区综合| 奇米精品一区二区三区在线观看| 亚洲精品成a人| 久久久99精品免费观看不卡| 91精品国产综合久久福利| 91在线码无精品| 奇米888四色在线精品| 亚洲三级电影网站| 国产日韩视频一区二区三区| 欧美精品一区二区三区久久久| 欧美色精品天天在线观看视频| 波多野结衣一区二区三区 | 欧美专区日韩专区| 99精品国产一区二区三区不卡| 寂寞少妇一区二区三区| 奇米色一区二区| 香港成人在线视频| 中文字幕日韩欧美一区二区三区| 欧美激情艳妇裸体舞| 精品国产sm最大网站| 91精品国产品国语在线不卡| 91福利视频久久久久| 一本色道久久综合狠狠躁的推荐| 99久久精品国产一区| 成人久久18免费网站麻豆 | 成人av网站免费观看| 久久不见久久见免费视频7| 石原莉奈在线亚洲三区| 一区二区三区在线视频免费观看| 亚洲日本在线a| 国产精品视频观看| 国产精品污网站| 国产精品国产三级国产专播品爱网 | 国产精品久久毛片a| 中文字幕 久热精品 视频在线| 久久免费美女视频| 欧美国产综合一区二区| 国产精品毛片大码女人| 中文字幕日本乱码精品影院| 日韩毛片一二三区| 一区二区成人在线观看| 亚洲h动漫在线| 男女性色大片免费观看一区二区| 免费精品99久久国产综合精品| 日本成人在线网站| 国产在线精品一区二区不卡了| 国产精品一区专区| 99综合电影在线视频| 欧美亚洲日本一区| 在线观看中文字幕不卡| 555www色欧美视频| 精品久久免费看| 中文av一区二区| 亚洲午夜日本在线观看| 日韩成人免费电影| 国产精品99久久久久久久女警| 国产高清亚洲一区| 日本高清免费不卡视频| 欧美日韩一级二级| 精品国产一区二区三区四区四 | 日本高清成人免费播放| 欧美日本国产一区| 日韩一区和二区| 亚洲国产高清不卡| 亚洲乱码国产乱码精品精98午夜| 五月天丁香久久| 风流少妇一区二区| 欧美日韩不卡一区| 国产拍欧美日韩视频二区| 亚洲国产精品影院| 国产一区二区在线观看免费| 欧美影院一区二区| 久久久久国产免费免费| 亚洲一区二区在线免费观看视频| 美国精品在线观看| 91美女精品福利| 精品国产欧美一区二区| 亚洲一级二级在线| 国产成人99久久亚洲综合精品| 欧美日韩一级二级| 国产精品美女久久久久久久久| 天天色图综合网| 91啪亚洲精品| 久久人人97超碰com| 同产精品九九九| 99r国产精品| 久久这里只有精品6| 午夜久久久久久久久| 国产精品综合在线视频| 欧美日韩亚洲综合在线| 国产精品福利av| 国内精品久久久久影院色| 欧美日韩一区视频| 亚洲丝袜美腿综合| 国产福利一区二区三区视频在线 | 成人午夜在线播放| 日韩精品在线一区二区| 亚洲无线码一区二区三区| 波多野结衣视频一区| 国产午夜精品福利| 久久99国产精品麻豆| 欧美老女人在线| 亚洲与欧洲av电影| 色综合色综合色综合| 国产午夜一区二区三区| 麻豆91在线看| 欧美一级片在线看| 日韩一区精品视频| 欧美三级蜜桃2在线观看| 亚洲欧美日韩电影| 94-欧美-setu| 自拍偷拍亚洲激情| 不卡的av网站| 中文字幕中文字幕中文字幕亚洲无线 | 久久国产尿小便嘘嘘尿| 91精品国产一区二区三区| 午夜a成v人精品| 欧美一区二区大片| 成人黄色777网| 国产精品―色哟哟| 成人avav影音| 国产精品素人视频| 97精品视频在线观看自产线路二| 国产精品女主播av| av电影在线观看一区| 亚洲日本va午夜在线电影| 91浏览器在线视频| 亚洲国产日韩a在线播放| 欧美伊人久久大香线蕉综合69| 亚洲综合另类小说| 91精品一区二区三区久久久久久 | 综合分类小说区另类春色亚洲小说欧美 | 日本aⅴ免费视频一区二区三区| 99久久777色| 夜夜揉揉日日人人青青一国产精品| 在线视频国内自拍亚洲视频| 亚洲1区2区3区4区| 日韩欧美一区在线观看| 国产一区二区视频在线| 中文一区一区三区高中清不卡| 成人av免费观看| 亚洲综合丝袜美腿| 日韩你懂的电影在线观看| 国产河南妇女毛片精品久久久| 国产精品国产三级国产| 欧洲国内综合视频| 免费在线观看不卡| 久久欧美一区二区| 在线国产电影不卡| 韩日欧美一区二区三区| 中文字幕日韩一区| 欧美一区二区三区思思人| 国产91精品入口|