亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

AVL Tree平衡二叉樹

2019-11-14 09:20:18
字體:
來源:轉載
供稿:網友
#include <iostream>#include <cstdio>using namespace std;// AVLTree平衡二叉樹(Balanced Binary Tree)/高度平衡的二叉查找樹 // 插入、刪除 typedef int DataType;typedef struct node{	DataType data;	int bf;				// 平衡因子 	struct node *lchild, *rchild;}AVLNode, *AVLTree;// 右單旋轉(LL旋轉): *a的左子樹的左子樹上 插入新結點 void RotateLL(AVLNode *&a){	AVLNode *b = a->lchild;	a->lchild = b->rchild;	b->rchild = a;	b->bf = a->bf = 0;	a = b;}// 左單旋轉(RR旋轉): *a的右子樹的右子樹上 插入新結點 void RotateRR(AVLNode *&a){	AVLNode *b = a->rchild;	a->rchild = b->lchild;	b->lchild = a;	b->bf = a->bf = 0;	a = b;}// 先左后右雙旋轉(LR旋轉): *a的左子樹的右子樹上 插入新結點 void RotateLR(AVLNode *&a){	AVLNode *b = a->lchild, *c = b->rchild;	b->rchild = c->lchild;				// 左單旋轉 	c->lchild = b;						// 左單旋轉 	if(c->bf <= 0)		b->bf = 1;	else		b->bf = 0;	a->lchild = c->rchild;				// 右單旋轉 	c->rchild = a;						// 右單旋轉 	if(c->bf == -1)		a->bf = 0;	else		a->bf = -1;	c->bf = 0;	a = c;}// 先右后左雙旋轉(RL旋轉): *a的右子樹的左子樹上 插入新結點 void RotateRL(AVLNode *&a){	AVLNode *b = a->rchild, *c = b->lchild;	b->lchild = c->rchild;				// 右單旋轉 	c->rchild = b;						// 右單旋轉 	if(c->bf >= 0)		b->bf = -1;	else		b->bf = 0;	a->rchild = c->lchild;				// 左單旋轉 	c->lchild = a;						// 左單旋轉 	if(c->bf == 1)		a->bf = 0;	else		a->bf = 1;	c->bf = 0;	a = c;}// 先序遞歸遍歷 void PReOrder(AVLTree root){	if(root != NULL)	{		printf("%4d", root->data);		PreOrder(root->lchild);		PreOrder(root->rchild);	}}void PreBF(AVLTree root)	// 先序遍歷平衡因子 {	if(root != NULL)	{		printf("%4d", root->bf);		PreBF(root->lchild);		PreBF(root->rchild);	}}void InOrder(AVLTree root)	// 中序遞歸遍歷 {	if(root != NULL)	{		PreOrder(root->lchild);		printf("%4d", root->data);		PreOrder(root->rchild);	}}// 計算樹的平衡因子 int count(AVLNode *r){	if(r->lchild == NULL && r->rchild == NULL)	{		r->bf = 0;		return 1;	}	else	{		int lhigh, rhigh;		if(r->lchild != NULL)		{			lhigh = count(r->lchild);		}		else			lhigh = 0;				if(r->rchild != NULL)		{			rhigh = count(r->rchild);		}		else			rhigh = 0;				r->bf = lhigh - rhigh;		// 因子 = 左子樹高度 - 右子樹高度 		if(lhigh > rhigh)			return lhigh + 1;		else			return rhigh + 1;	}}// 一個結點一個結點地添加/刪除,然后調整,所以平衡因子不會超過2/-2 // 在root樹種,添加值為x的結點,并且調整成為平衡二叉樹 AVLNode* InsertAndBalance(AVLTree &root, DataType x){	AVLNode *s, *p, *f;		if(root == NULL)	{		root = new AVLNode;		if(root == NULL)			return NULL;		root->data = x;		root->bf = 0;		root->lchild = NULL;		root->rchild = NULL;		return root;	}	else	{		if(x > root->data)		{			root->rchild = InsertAndBalance(root->rchild, x);						count(root);	// 修改結點的bf值,并返回高度(此處可以優化,需要重新遞歸求平衡因子) 						if(root->bf == 2)		// 如果不平衡,進行旋轉 			{				if(root->lchild->bf == 1)					RotateLL(root);				else if(root->lchild->bf == -1)					RotateLR(root);				count(root);			}			else if(root->bf == -2)			{				if(root->rchild->bf == -1)					RotateRR(root);				else if(root->rchild->bf == 1)					RotateRL(root);				count(root);			}					}		else if(x < root->data)		{			root->lchild = InsertAndBalance(root->lchild, x);						count(root);	// 修改結點的bf值,并返回高度(此處可以優化,需要重新遞歸求平衡因子) 						if(root->bf == 2)		// 如果不平衡,進行旋轉 			{				if(root->lchild->bf == 1)					RotateLL(root);				else if(root->lchild->bf == -1)					RotateLR(root);				count(root);			}			else if(root->bf == -2)			{				if(root->rchild->bf == -1)					RotateRR(root);				else if(root->rchild->bf == 1)					RotateRL(root);				count(root);			}					}			}		return root;}// 在root樹種,刪除結點x,并且調整成為平衡二叉樹 AVLNode* RemoveAndBalance(AVLTree &root, DataType x){	AVLNode *s, *p, *f;		if(root == NULL)	{		return root;	}	else	{		if(x > root->data)		{			root->rchild = RemoveAndBalance(root->rchild, x);						count(root);	// 修改結點的bf值,并返回高度(此處可以優化,需要重新遞歸求平衡因子) 						if(root->bf == 2)		// 如果不平衡,進行旋轉 			{				if(root->lchild->bf == 1)					RotateLL(root);				else if(root->lchild->bf == -1)					RotateLR(root);				count(root);			}			else if(root->bf == -2)			{				if(root->rchild->bf == -1)					RotateRR(root);				else if(root->rchild->bf == 1)					RotateRL(root);				count(root);			}					}		else if(x < root->data)		{			root->lchild = RemoveAndBalance(root->lchild, x);						count(root);	// 修改結點的bf值,并返回高度(此處可以優化,需要重新遞歸求平衡因子) 						if(root->bf == 2)		// 如果不平衡,進行旋轉 			{				if(root->lchild->bf == 1)					RotateLL(root);				else if(root->lchild->bf == -1)					RotateLR(root);				count(root);			}			else if(root->bf == -2)			{				if(root->rchild->bf == -1)					RotateRR(root);				else if(root->rchild->bf == 1)					RotateRL(root);				count(root);			}					}		else if(x == root->data)		{			AVLNode *s, *f;			if(root->lchild == NULL && root->rchild == NULL)	// 葉子的時候 			{				delete root;				return NULL;			}			else if(root->lchild == NULL && root->rchild != NULL)			{				s = root->rchild;				delete root;				return s;			}			else if(root->lchild != NULL && root->rchild == NULL)			{				s = root->lchild;				delete root;				return s;			}			else if(root->lchild != NULL && root->rchild != NULL)			{				s = root->lchild;				if(s->rchild != NULL)				{					while(s->rchild != NULL)					{						f = s;						s = s->rchild;					}					f->rchild = NULL;					root->data = s->data;					if(s->lchild != NULL)					{						if(f->data > s->lchild->data)							f->lchild = s->lchild;						else							f->rchild = s->lchild;					}				}				else		// 左子樹沒有右結點時 				{					root->data = s->data;					root->lchild = s->lchild;				}				delete s;				return root;			}		}	}		return root;}int main(){	int high;	AVLNode *s, *f;	AVLTree root = NULL;	InsertAndBalance(root, 53);	InsertAndBalance(root, 17);	InsertAndBalance(root, 9);	InsertAndBalance(root, 45);	InsertAndBalance(root, 23);	InsertAndBalance(root, 78);	InsertAndBalance(root, 65);	InsertAndBalance(root, 66);	InsertAndBalance(root, 67);	//InsertAndBalance(root, 94);	//InsertAndBalance(root, 81);	//InsertAndBalance(root, 88);	//high = count(root);	//cout << "Tree high is " << high << endl;	cout << "數值: ";	PreOrder(root);	cout << endl;	cout << "因子: ";	PreBF(root);	cout << endl << endl;		RemoveAndBalance(root, 45);	RemoveAndBalance(root, 9);	cout << "先序遍歷: ";	PreOrder(root);	cout << endl;	cout << "中序遍歷: ";	InOrder(root);	cout << endl;	cout << "平衡因子: ";	PreBF(root);	cout << endl << endl;		RemoveAndBalance(root, 17);	RemoveAndBalance(root, 53);	InsertAndBalance(root, 94);	cout << "先序遍歷: ";	PreOrder(root);	cout << endl;	cout << "中序遍歷: ";	InOrder(root);	cout << endl;	cout << "平衡因子: ";	PreBF(root);	cout << endl << endl;			return 0;}
上一篇:

下一篇:STM32F4移植ucos_II

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
这里只有精品在线播放| 久久久久久伊人| 亚洲欧美日韩中文在线| 亚洲福利在线观看| 色偷偷av一区二区三区乱| 中文字幕日韩在线播放| 亚洲欧美一区二区精品久久久| 欧美性猛交xxxx偷拍洗澡| 欧美成人三级视频网站| 久久精品国产91精品亚洲| 在线视频中文亚洲| 久久久久久久久久国产| 97视频在线观看免费高清完整版在线观看| 亚洲品质视频自拍网| 深夜福利亚洲导航| 成人亚洲欧美一区二区三区| 91视频8mav| 97在线视频免费观看| 97超级碰碰碰| 欧美一级淫片videoshd| 国产日韩欧美在线| 超碰97人人做人人爱少妇| 欧美激情国产高清| 91精品视频在线免费观看| 日韩中文在线不卡| 免费av一区二区| 久久久欧美精品| 一本色道久久综合亚洲精品小说| 久久久久久久久国产精品| 91精品国产电影| 日韩中文有码在线视频| 国产丝袜一区二区三区免费视频| 国产精品亚洲一区二区三区| 国产精品美女网站| 久久久欧美一区二区| 国产欧美va欧美va香蕉在| 久久亚洲精品毛片| 欧美成人在线影院| 精品高清美女精品国产区| 最近中文字幕mv在线一区二区三区四区| 亚洲综合在线做性| 欧美性猛交xxxx| 久久久久久国产精品久久| 久久中文字幕视频| 欧美视频二区36p| 亚洲丝袜在线视频| 国产精品久久久av久久久| 亚洲护士老师的毛茸茸最新章节| 精品国产一区二区三区久久狼黑人| 欧美在线视频免费| 亚洲精品国偷自产在线99热| 欧美日韩一区二区精品| 久久久久久中文| 欧美精品www在线观看| 国产精品电影在线观看| 久久精品电影网| 亚洲а∨天堂久久精品9966| 欧美激情国产精品| 中文字幕日韩视频| 成人激情春色网| 成人情趣片在线观看免费| 91精品视频在线| 欧美性猛交xxxx免费看漫画| 国产91色在线免费| 色综合天天狠天天透天天伊人| 亚洲缚视频在线观看| 亚洲v日韩v综合v精品v| 91啪国产在线| 亚洲成色777777在线观看影院| 欧美超级乱淫片喷水| 久久精品视频免费播放| 日韩av色综合| 久久久免费精品| 中文字幕亚洲天堂| 91在线|亚洲| 亚洲欧美国产精品久久久久久久| 国产亚洲精品综合一区91| 久久精品国产久精国产思思| 国产欧美日韩免费看aⅴ视频| 亚洲老板91色精品久久| www.日韩免费| 韩国三级日本三级少妇99| 日韩精品极品在线观看播放免费视频| 久久免费精品视频| 欧美极品少妇xxxxⅹ免费视频| 欧美亚洲第一区| 欧美亚洲第一区| 91色中文字幕| 久久久在线视频| 欧美精品免费在线| 久久婷婷国产麻豆91天堂| 国产98色在线| 国产91精品在线播放| 亚洲综合小说区| 中文字幕av一区二区| 国产专区精品视频| 欧美亚洲日本黄色| 日本精品久久中文字幕佐佐木| 日本久久久久久久久| 欧美成人全部免费| 亚洲欧美日韩爽爽影院| 欧美亚洲成人xxx| 国产欧美精品一区二区三区-老狼| 日韩av在线影院| 亚洲电影免费观看高清完整版在线观看| 在线精品视频视频中文字幕| 欧美成人在线网站| 成人国产精品av| 亚州av一区二区| 96精品视频在线| 91黑丝高跟在线| 91久热免费在线视频| 91亚洲人电影| 4p变态网欧美系列| 激情懂色av一区av二区av| 青青草原成人在线视频| 日韩影视在线观看| 国产欧美久久久久久| 亚洲精品456在线播放狼人| 欧美性猛交xxxx偷拍洗澡| 欧美国产高跟鞋裸体秀xxxhd| 亚洲国产黄色片| 亚洲视频精品在线| 国产视频丨精品|在线观看| 欧美电影电视剧在线观看| 国产色婷婷国产综合在线理论片a| 亚洲国产成人精品女人久久久| 97超碰色婷婷| 精品人伦一区二区三区蜜桃网站| 91九色综合久久| 亚洲人成亚洲人成在线观看| 2019中文字幕全在线观看| 欧美视频在线免费看| 中文字幕欧美在线| 日本精品性网站在线观看| 日韩毛片中文字幕| 精品久久久久久久久久久| 91高潮在线观看| 国产精品白丝av嫩草影院| 亚洲欧洲中文天堂| 91免费精品国偷自产在线| 亚洲电影在线看| 亚洲成av人乱码色午夜| 91国内揄拍国内精品对白| 亚洲free性xxxx护士白浆| 日本免费久久高清视频| 在线观看亚洲区| 97色在线视频观看| 亚洲性无码av在线| 91九色精品视频| 91tv亚洲精品香蕉国产一区7ujn| 久久亚洲国产成人| 国产精品久久久久久五月尺| 久久久中文字幕| 国产精品自拍视频| 国产精品视频yy9099| 亚洲精品免费网站| 国产日韩综合一区二区性色av| 福利视频第一区| 色综合老司机第九色激情| 欧美www视频在线观看| 成人免费福利在线| 日韩在线视频一区| 色噜噜狠狠色综合网图区|