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

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

?? avl_tree.cpp

?? avl樹的插入刪除調(diào)整等等基本操作及具體實現(xiàn)
?? CPP
字號:
#include<iostream.h>
#include<iomanip.h>
#include<assert.h>

struct AVL_node
{
	int value;	//節(jié)點的值
	int balance_factor;	//右子樹高度-左子樹高度
	int depth;	//結(jié)點的高度
	AVL_node* parent;	//父節(jié)點
	AVL_node* left_child ;		//左子結(jié)點
	AVL_node* right_child;		//右子結(jié)點
};

typedef struct AVL_node AVL_node;

int search_node(int, AVL_node*, AVL_node** ,AVL_node**);	//查找值為value的節(jié)點,當(dāng)沒有找到結(jié)點時,保存尋找的最后一個結(jié)點

int depth(int, AVL_node*);

void adjust_node(AVL_node*, AVL_node*, AVL_node*, AVL_node**);	//調(diào)整插入的結(jié)點,使其滿足AVL樹的要求

int insert_node(int, AVL_node*, AVL_node**);	//插入一個結(jié)點,返回插入后AVL樹的根

int delete_node(int, AVL_node*, AVL_node**);	//刪除一個結(jié)點,

void AVL_pre_order(AVL_node*);	//前序遍歷AVL樹

void AVL_in_order(AVL_node*, int);	//中序遍歷AVL樹


int search_node(int value, AVL_node* root, AVL_node** node, AVL_node** parent)
{
	AVL_node* temp;
	int ret = 0;

	if (root == NULL)	//根節(jié)點為NULL時,返回-1
		ret = -1;
	else
	{
		*parent = NULL;
		temp = root;
		while (temp != NULL)
		{
			if (temp->value == value){
				*node = temp;
				ret = 1;
				break;
			}
			else{
				*parent = temp;
				if (temp->value > value)
					temp = temp->left_child; 
				else if (temp->value < value)
					temp = temp->right_child;
			}
		}
	}
	return ret;
}

int depth(int value, AVL_node* root)
{
	AVL_node* parent;
	AVL_node* node;
	if (search_node(value, root, &node, &parent))
	{
		return node->depth;
	}
	else return -1;
}


void adjust_AVL_tree(AVL_node* root, AVL_node* parent, AVL_node* child, AVL_node** ret)
{
	AVL_node* temp;
	assert((parent != NULL) && (child != NULL));
	switch (parent->balance_factor)
	{
		case -2:
		if (child->balance_factor == 1)	//LR型雙旋轉(zhuǎn)
		{
			temp = child->right_child;
			temp->parent = parent->parent;	//原來的最低結(jié)點上升為最高結(jié)點
			child->right_child = temp->left_child;//最低結(jié)點的子結(jié)點分部成為最高和中間結(jié)點的子結(jié)點
			if (temp->left_child != NULL)
				 temp->left_child->parent = child;//原來的中間節(jié)點成為最低節(jié)點的子結(jié)點
			parent->left_child = temp->right_child;//最低結(jié)點的子結(jié)點分部成為最高和中間結(jié)點的子結(jié)點
			
			if (temp->right_child != NULL)
				temp->right_child->parent = parent;
			temp->left_child = child;
			child->parent = temp;
			temp->right_child = parent;
			
			if (parent->parent != NULL)
				if (parent->parent->left_child == parent)	
					parent->parent->left_child = temp;
				else parent->parent->right_child = temp;
			else
				root = temp;
			parent->parent = temp;
			
			switch(temp->balance_factor)
			{
			case 0:
				parent->balance_factor = 0;
				child->balance_factor = 0;
				break;
			case 1:
				parent->balance_factor = 0;
				child->balance_factor = -1;
				break;
			default:
				parent->balance_factor = 1;
				child->balance_factor = 0;
				break;
			}
			temp->balance_factor = 0;
		}
		else //LL型單旋轉(zhuǎn)
		{
			
			child->parent = parent->parent;//中間節(jié)點成為最高節(jié)點
			parent->left_child = child->right_child;
			if (child->right_child != NULL)
				child->right_child->parent = parent;
			child->right_child = parent;
			if (parent->parent != NULL)
				if (parent->parent->left_child == parent)
					parent->parent->left_child = child;
				else parent->parent->right_child = child;
			else
				root = child;
			parent->parent = child;
			switch(child->balance_factor)
			{
			case -1:
				child->balance_factor = 0;
				parent->balance_factor = 0;
				break;
			default:
				child->balance_factor = 1;
				parent->balance_factor = -1;
				break;
			}
	    }	
		break;
   
		case 2:
		if (child->balance_factor == -1) //RL型雙旋轉(zhuǎn)
		{
			temp = child->left_child;
			temp->parent = parent->parent;
			child->left_child = temp->right_child;
			if (temp->right_child != NULL)
				temp->right_child->parent = child;
			parent->right_child = temp->left_child;
			if (temp->left_child != NULL)
				temp->left_child->parent = parent;
			temp->left_child = parent;
			temp->right_child = child;
			child->parent = temp;
			if (parent->parent != NULL)
				if (parent->parent->left_child == parent)
					parent->parent->left_child = temp;
				else parent->parent->right_child = temp;
			else
		        root = temp;
			parent->parent = temp;
			switch(temp->balance_factor)
			{
			case 0:
				parent->balance_factor = 0;
				child->balance_factor = 0;
				break;
			case -1:
				parent->balance_factor = 0;
				child->balance_factor = 1;
				break;
			default:
				parent->balance_factor = -1;
				child->balance_factor = 0;
				break;
			}
			temp->balance_factor = 0;
		}
		else  //RR型單旋轉(zhuǎn)
		{
			child->parent = parent->parent;
			parent->right_child = child->left_child;
			if (child->left_child != NULL)
				child->left_child->parent = parent;
		    child->left_child = parent;
			if (parent->parent != NULL)
				if (parent->parent->left_child == parent)
					parent->parent->left_child = child;
				else parent->parent->right_child = child;
			else
				root = child;
			parent->parent = child;
			switch(child->balance_factor)
			{
			case 1:
				child->balance_factor = 0;
				parent->balance_factor = 0;
				break;
			default:
				child->balance_factor = -1;
				parent->balance_factor = 1;
				break;
			}
		
		}
		break;
	}
	*ret = root;
}


int insert_node(int value, AVL_node* root, AVL_node** ret)
{
	AVL_node *parent = NULL, *insert = NULL, *child = NULL, *node;
	int tmp,stop;
	insert = new AVL_node;
	insert->value = value;
	insert->left_child = NULL;
	insert->right_child = NULL;
	insert->balance_factor = 0;
	if (root == NULL)				//插入根節(jié)點
	{
		insert->parent = NULL;
		*ret = insert;
		return 1;
	}
	else
	if (tmp = search_node(value, root, &node, &parent))	//有重復(fù)結(jié)點,不插入,保存最后一個找到的結(jié)點,供后續(xù)插入使用
	{
		*ret = root;
		return 0;
	}
	else
	{
//============== 插入結(jié)點 ===============
		insert->parent = parent;	
		if (value < parent->value)
		{
			parent->left_child = insert;
			child = parent->left_child;	//保存插入的結(jié)點
		}
		else
		{
			parent->right_child = insert;
			child = parent->right_child;
		}

//======== 尋找需要調(diào)整的最小子樹=========
		stop = 0;
		while ((parent != NULL))
		{
			//更新父節(jié)點的balance_factor:
			if (child == parent->left_child)					//新節(jié)點在父節(jié)點左面
				switch (parent->balance_factor)
				{
				case 1:
					parent->balance_factor = 0;			//平衡,不需要調(diào)整
					*ret = root;
					return 1;
				case -1:
					parent->balance_factor = -2;
					stop = 1;
					break;
				default:
					parent->balance_factor = -1;
					child = parent;
					parent = parent->parent;
					break;
				}
			else										//新節(jié)點在父節(jié)點右邊
				switch (parent->balance_factor)
				{	
				case -1:
					parent->balance_factor = 0;
					*ret = root;
					return 1;
				case 1:
					parent->balance_factor = 2;
					stop = 1;
					break;
				default:
					parent->balance_factor = 1;
					child = parent;
					parent = parent->parent;
					break;
				}
				if (stop) break;
			}
		
		if (parent == NULL)								//不需要調(diào)整
		{
			*ret = root;
			return 1;
		}
		adjust_AVL_tree(root, parent, child, ret);			//不平衡時要調(diào)整
		return 1;
	}
}

int delete_node(int value, AVL_node* root, AVL_node** ret)
{
	AVL_node *deleted_node = NULL, *parent = NULL, *child = NULL, *temp_parent = NULL, *node = NULL;
	int temp, flag;

	assert(root!=NULL);

	if (!search_node(value, root, &node, &parent)){
	    *ret = root;
		return 0;
	}
	else
	{
		//確定要刪除結(jié)點
	    if (parent == NULL)
			deleted_node = root;
		else if ((parent->left_child != NULL) && (parent->left_child->value == value))
			deleted_node = parent->left_child;
		else deleted_node = parent->right_child;

		child = deleted_node;
		
		//如果要刪除的結(jié)點有子結(jié)點,則將要刪除的結(jié)點內(nèi)容與其中序遍歷時的前驅(qū)相交換,如此迭代,直到找到一個沒有子結(jié)點的結(jié)點為止
		while ((child->left_child != NULL) || (child->right_child != NULL))
		{
			if (child->balance_factor == -1){
				if (deleted_node->left_child != NULL){
					child = deleted_node->left_child;	
					while (child->left_child != NULL)
						child = child->left_child;
				}
				else{
					child = deleted_node;
					while ((child->parent != NULL) && (child != child->parent->right_child));
						child = child->parent;
				}	
			}

			else{
				if (deleted_node->right_child != NULL){
					child = deleted_node->right_child;	
					while (child->right_child != NULL)
						child = child->right_child;
				}
				else{
					child = deleted_node;
					while ((child->parent != NULL) && (child != child->parent->left_child));
						child = child->parent;
				}
			}

			temp = child->value;
			child->value = deleted_node->value;
			deleted_node->value = temp;
			deleted_node = child;
		}

		//真正要刪除的點
		child = deleted_node;
		parent = deleted_node->parent;

		//調(diào)節(jié)刪除后的不平衡
		while ((parent != NULL)) //查找需要調(diào)整的最小子樹
		{
			if (child == parent->left_child)
			{
				if (parent->balance_factor == -1)
				{
					parent->balance_factor = 0;
					child = parent;
					parent = parent->parent;
				}
				else if (parent->balance_factor == 1)
				{
					parent->balance_factor = 2;
					child = parent->right_child;
					temp = parent->right_child->balance_factor;
					temp_parent = parent->parent;
					if (temp_parent == NULL)
						flag = 0;
					else
						if (parent == temp_parent->left_child)
							flag = 1;
						else flag = -1;
					
					adjust_AVL_tree(root, parent, child, &root);

					if (temp != 0)
					{
						switch(flag)
						{
						case 1:
							child = temp_parent->left_child;
							break;
						case -1:
							child = temp_parent->right_child;
							break;
						}
						parent = temp_parent;
					}
					else break;
				}
				else
				{
					parent->balance_factor = 1;
					break;
				}
			}
			else 
				if (parent->balance_factor == 1)
				{
					parent->balance_factor = 0;
					child = parent;
					parent = parent->parent;
				}
				else if (parent->balance_factor == -1)
				{
					parent->balance_factor = -2;
					child = parent->left_child;
					temp = parent->left_child->balance_factor;
					temp_parent = parent->parent;
					if (temp_parent == NULL)
						flag = 0;
					else
						if (parent == temp_parent->left_child)
							flag = 1;
						else flag = -1;

					adjust_AVL_tree(root, parent, child, &root);

					if (temp != 0)
					{
						if (flag == 1)
							child = temp_parent->left_child;
						else if (flag == -1)
							child = temp_parent->right_child;
						parent = temp_parent;
					}
					else break;
				}
				else
				{
					parent->balance_factor = -1;
					break;
				}
		}
	    if (deleted_node->parent != NULL)
			if (deleted_node != deleted_node->parent->left_child)
				deleted_node->parent->right_child = NULL;
			else deleted_node->parent->left_child = NULL;

		delete deleted_node;
		if (root == deleted_node)
			root = NULL;
		deleted_node = NULL;
		*ret = root;
		return 1;
	}
}

void AVL_pre_order(AVL_node* root) //前序遍歷
{
	if (root != NULL)
	{
		AVL_pre_order(root->left_child);
		if(root->parent != NULL)
			cout<<setw(3)<<root->value<<"  parent: "<<setw(3)<<root->parent->value;
		else
			cout<<setw(3)<<root->value<<"  root!      ";
		if(root->left_child!=NULL)
			cout<<"  left_child: "<<setw(3)<<root->left_child->value;
		else cout<<"  no left_child!";
		if(root->right_child!=NULL)
			cout<<"   right_child: "<<setw(3)<<root->right_child->value;
		else cout<<"   no rifht_child!";
		cout<<endl;
		AVL_pre_order(root->right_child);
	}
}

void AVL_in_order(AVL_node* root, int depth) //中序遍歷
{
	if (root != NULL)
	{
		if(root->parent != NULL)
			cout<<setw(3)<<root->value<<"  parent: "<<setw(3)<<root->parent->value;
		else
			cout<<setw(3)<<root->value<<"  root!      ";
		if(root->left_child!=NULL)
			cout<<"  left_child: "<<setw(3)<<root->left_child->value;
		else cout<<"  no left_child!";
		if(root->right_child!=NULL)
			cout<<"   right_child: "<<setw(3)<<root->right_child->value;
		else cout<<"   no rifht_child!";
		cout<<endl;
		root->depth = depth;
		AVL_in_order(root->left_child, depth + 1);
		AVL_in_order(root->right_child, depth + 1);
	}
}


void main(int argc, char *argv[])
{
	AVL_node* root = NULL;
	int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	int i;
	
	for(i = 0; i < sizeof(data)/sizeof(int); i++)
	{
		if(insert_node(data[i], root, &root)){
			cout<<"                      AFTER ADDING NODE: "<<data[i]<<endl;
			cout<<"Pre_order:"<<endl;
			AVL_pre_order(root);
			cout<<endl;
			cout<<"In_order:"<<endl;
			AVL_in_order(root,0);
			cout<<endl;
		}
		else
		{
			cout<<"Inserting failed!"<<endl;
			break;
		}
	}

	for(i = 0; i < sizeof(data)/sizeof(int); i++)
	{
		if(delete_node(data[i], root, &root)){
			cout<<"                      AFTER DELETING NODE: "<<data[i]<<endl;
			cout<<"Pre_order:"<<endl;
			AVL_pre_order(root);
			cout<<endl;
			cout<<"In_order:"<<endl;
			AVL_in_order(root,0);
			cout<<endl;
		}
		else
		{
			cout<<"Deleting failed!"<<endl;
			break;
		}
	}
} 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一级免费大片| 国产日产亚洲精品系列| 日韩美女在线视频| 亚洲激情自拍偷拍| 亚洲国产va精品久久久不卡综合 | 日韩主播视频在线| 日本高清成人免费播放| 国产亚洲一区字幕| 精品在线免费观看| 欧美电影免费观看高清完整版 | 成人综合在线观看| 日韩限制级电影在线观看| 亚洲欧美电影院| 成人精品在线视频观看| 国产午夜精品一区二区三区视频| 美女脱光内衣内裤视频久久网站 | 看片网站欧美日韩| 2022国产精品视频| 亚洲在线观看免费视频| 92国产精品观看| 亚洲欧洲色图综合| 欧美人动与zoxxxx乱| 无吗不卡中文字幕| 久久久久久黄色| 欧美男男青年gay1069videost| 国产精品久久久久久久久免费樱桃| 国产综合一区二区| 久久久久国色av免费看影院| 国产99精品国产| 亚洲九九爱视频| 欧美日韩国产精选| 国产精品夜夜爽| 综合久久综合久久| 日韩一区二区在线观看视频| 国产一区二区三区最好精华液| 日韩中文字幕1| 亚洲日本va午夜在线影院| 欧美精品国产精品| 国产成人av网站| 一区二区三区日本| 国产日韩欧美a| 欧美日韩午夜在线视频| 成人污污视频在线观看| 午夜久久久影院| 亚洲男女一区二区三区| 欧美精品一区视频| 色综合天天做天天爱| 日本午夜一区二区| 亚洲麻豆国产自偷在线| 欧美精品一区二| 久久亚洲一级片| 欧美日韩一区二区在线观看| k8久久久一区二区三区| 美女视频一区在线观看| 亚洲va欧美va人人爽| 久久久高清一区二区三区| 欧美久久一二三四区| eeuss鲁片一区二区三区| 国产在线一区观看| 久久成人综合网| 蜜臀av性久久久久蜜臀aⅴ流畅 | 欧美午夜在线观看| 欧美日韩国产区一| 日韩丝袜美女视频| 久久你懂得1024| 亚洲三级免费观看| 午夜亚洲福利老司机| 日韩成人伦理电影在线观看| 日本aⅴ亚洲精品中文乱码| 美女在线观看视频一区二区| 国产经典欧美精品| 国产99久久久精品| 6080yy午夜一二三区久久| 91精品国产黑色紧身裤美女| av在线播放一区二区三区| 欧美中文字幕亚洲一区二区va在线| 欧美性生活大片视频| 久久综合色综合88| 国产精品久久久久精k8 | 欧美天堂一区二区三区| 国产三级欧美三级| 亚洲高清免费在线| 色网站国产精品| 亚洲美女精品一区| 国产69精品久久久久毛片| 91九色02白丝porn| 亚洲国产精品激情在线观看| 亚洲成在人线免费| 91丝袜美女网| 午夜成人免费视频| 欧美一级理论片| 日韩二区三区四区| 欧美亚洲综合另类| 亚洲影院久久精品| 91福利社在线观看| 视频一区在线视频| 欧美精品色一区二区三区| 亚洲成人资源网| 欧美日韩精品欧美日韩精品一综合 | 亚洲欧洲av在线| 成人av网站在线观看| 136国产福利精品导航| 色综合天天综合狠狠| 国产精品久久综合| 欧美日韩一区二区三区在线看| 亚洲成人动漫av| 日韩免费性生活视频播放| 黑人巨大精品欧美一区| 国产精品久久久久aaaa樱花| 色妞www精品视频| 欧美aⅴ一区二区三区视频| 亚洲精品一区二区在线观看| 波多野结衣亚洲一区| 亚洲精品免费在线| 欧美精品一区二区三区在线播放 | 久久精品国产网站| 国产三级欧美三级日产三级99| 国产精品一区久久久久| 国产精品嫩草久久久久| 欧美这里有精品| 国产一区欧美二区| 亚洲人成网站色在线观看| 欧美一区二区人人喊爽| 99久久夜色精品国产网站| 激情综合色播激情啊| 一区二区三区欧美激情| 国产日产欧美一区二区三区| 欧美特级限制片免费在线观看| 美女尤物国产一区| 五月天国产精品| 亚洲精品一二三| 一区二区三区欧美久久| 亚洲国产乱码最新视频 | 国产一区二区三区日韩| 日本欧美在线看| 免费美女久久99| 国产一区久久久| 成人av网址在线| 色94色欧美sute亚洲13| 欧美亚洲动漫精品| 亚洲成人精品影院| 一本大道av一区二区在线播放| 成人一区二区三区中文字幕| 99精品欧美一区二区蜜桃免费| 一本一道久久a久久精品 | 欧美在线一二三| 91免费国产在线观看| 色婷婷精品久久二区二区蜜臂av| 色呦呦国产精品| 青青草一区二区三区| 极品销魂美女一区二区三区| 99久久综合国产精品| 日韩欧美二区三区| 夜夜精品视频一区二区| 高清不卡在线观看av| 91精品国产美女浴室洗澡无遮挡| 综合在线观看色| 久久机这里只有精品| 99精品国产一区二区三区不卡| 91精品国产色综合久久不卡蜜臀| 26uuu色噜噜精品一区| 亚洲一区二区偷拍精品| 国产麻豆视频一区| 欧美日韩精品一区二区在线播放| 日韩欧美一二三| 亚洲第一二三四区| www.日韩在线| 久久久国产精品不卡| 性欧美疯狂xxxxbbbb| 91最新地址在线播放| 久久影院电视剧免费观看| 亚洲国产另类av| 成人精品国产一区二区4080| 精品久久久久久久久久久久久久久 | 精品写真视频在线观看| 日本精品一级二级| 中文字幕一区二区三区四区不卡 | 97se亚洲国产综合自在线观| 2023国产一二三区日本精品2022| 亚洲在线免费播放| 91网页版在线| 国产精品初高中害羞小美女文| 黄色小说综合网站| 日韩亚洲电影在线| 久久99精品久久久久久久久久久久| 日本精品一区二区三区高清 | 国产精品网站导航| 国产在线一区二区综合免费视频| 欧美一区二区三区免费| 日韩主播视频在线| 日韩免费高清电影| 久久国产乱子精品免费女| 久久这里只有精品首页| 国产成人精品免费在线| 中文av一区二区| 色欧美88888久久久久久影院| 午夜欧美电影在线观看| 久久久久国产精品麻豆ai换脸| 国产成人免费av在线| 一区二区三区av电影|