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

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

AVL Tree平衡二叉樹

2019-11-11 07:28:42
字體:
來源:轉載
供稿:網友
#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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品综合久久久| 日韩理论片久久| 中文在线资源观看视频网站免费不卡| 欧洲亚洲免费在线| www.久久久久久.com| 日韩hd视频在线观看| 91精品国产高清自在线看超| 日本中文字幕久久看| 成人激情黄色网| 一区二区三区国产在线观看| 国产精品露脸自拍| 国产成人精品视| 国产成人精品日本亚洲| 日韩电影免费观看中文字幕| www.欧美免费| 亚洲欧美日韩国产成人| 久久精品99无色码中文字幕| 国产成人极品视频| 2019av中文字幕| 日韩精品免费电影| 日韩中文字幕视频| 国产精品丝袜久久久久久不卡| 亚洲综合色av| 日韩在线观看免费| 欧美性视频网站| 成人精品视频在线| 丝袜美腿精品国产二区| 亚洲精品乱码久久久久久金桔影视| 国语自产在线不卡| 久久久极品av| 日韩av网站导航| 中文字幕亚洲欧美日韩在线不卡| 欧美激情免费视频| 欧美在线视频a| 不卡av电影院| 欧美性xxxxxxxxx| 自拍偷拍亚洲一区| 亚洲摸下面视频| 免费成人高清视频| 久久久久五月天| 国产亚洲精品一区二区| 久久久国产在线视频| 午夜精品美女自拍福到在线| 日本精品性网站在线观看| 中文字幕一区二区三区电影| 日韩高清电影免费观看完整版| 8090理伦午夜在线电影| 久久久久久18| 国产成人福利网站| 国产精品777| 久久精品色欧美aⅴ一区二区| 国产精品精品久久久| 欧美性猛交xxxx乱大交极品| 精品香蕉在线观看视频一| 成人免费高清完整版在线观看| 美女久久久久久久久久久| 一本色道久久88综合亚洲精品ⅰ| 日韩精品在线观看视频| 欧美裸身视频免费观看| 久久久久成人精品| 亚洲区bt下载| 日韩精品久久久久久福利| 另类美女黄大片| 欧美一区深夜视频| 亚洲理论电影网| 欧美黄网免费在线观看| 久久久久久久久久久久久久久久久久av| 最近2019中文字幕大全第二页| 亚洲一区二区三区成人在线视频精品| 精品亚洲aⅴ在线观看| 九九热视频这里只有精品| 欧美成人午夜视频| 久久精品国产久精国产一老狼| 精品视频久久久久久| 日韩中文字幕免费| 欧洲s码亚洲m码精品一区| 日韩在线不卡视频| 久久中文精品视频| 国产亚洲福利一区| 国产97在线|亚洲| 色妞久久福利网| 日韩欧美国产成人| 日韩黄色在线免费观看| 性欧美办公室18xxxxhd| 超薄丝袜一区二区| 国产精品91视频| 亚洲sss综合天堂久久| 日韩精品一二三四区| 日本精品久久久久影院| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩福利电影| 欧美亚洲国产日韩2020| 91精品国产91久久久| 欧美国产精品人人做人人爱| 成人免费福利视频| 最近中文字幕mv在线一区二区三区四区| 日韩av综合中文字幕| 国产一区二区三区中文| 黄色成人在线免费| 亚洲精品美女久久久| 国产精品视频xxxx| 91久久久久久久久| 欧美日韩一区二区在线| 欧美久久精品一级黑人c片| 中文字幕亚洲欧美| 狠狠色狠狠色综合日日小说| 欧美男插女视频| 91在线观看免费网站| 国产精品成久久久久三级| 中文字幕日韩精品在线观看| 成人性生交大片免费看小说| 91黑丝高跟在线| 国产亚洲激情视频在线| 国产精品久久久久av免费| 成人天堂噜噜噜| 成人激情黄色网| 韩剧1988免费观看全集| 2019中文字幕在线观看| 日韩av理论片| 欧美日韩视频免费播放| 久久久久久综合网天天| 日韩精品免费视频| 亚洲精品日韩激情在线电影| 国产999在线| 91久久精品一区| 欧美激情精品久久久久久大尺度| 黑人精品xxx一区一二区| 欧美中文字幕视频在线观看| yellow中文字幕久久| 一个人看的www欧美| 欧美xxxwww| 亚洲精品欧美一区二区三区| 国产精品福利久久久| 亚洲人成自拍网站| 97精品在线观看| 欧美激情久久久久久| 国产精品白丝av嫩草影院| 亚洲电影在线看| 日韩经典一区二区三区| 日本精品视频在线观看| 超碰97人人做人人爱少妇| 欧美—级a级欧美特级ar全黄| 欧美日韩中文字幕综合视频| 精品久久久久久亚洲国产300| 欧美激情在线一区| 成人国产精品一区二区| 国产精品久久久久久久电影| 亚洲人成77777在线观看网| 另类专区欧美制服同性| 91国产中文字幕| 人人做人人澡人人爽欧美| 中文字幕少妇一区二区三区| 久久人人97超碰精品888| 日韩精品中文字幕视频在线| 国产精品美女久久久免费| 欧美精品一区二区免费| 国产97免费视| 日韩经典中文字幕| 亚洲欧美一区二区三区在线| 九色91av视频| 欧美国产日本高清在线| 久久999免费视频| 91精品久久久久久久久久久久久| 性欧美xxxx|