国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

AVL樹(平衡二叉搜索樹)

這篇具有很好參考價值的文章主要介紹了AVL樹(平衡二叉搜索樹)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

如果BST樹插入的順序是有序的,那么BST樹就會退化成一個雙鏈表結構,查詢的速率就會很慢,

所以有了AVL樹的意義。

AVL樹的定義:

是具有下列性質的二叉搜索樹

? ? ? ? 1、它的左子樹和右子樹都是AVL樹

? ? ? ? 2、左子樹和右子樹的高度之差的絕對值不超過1

結點的平衡因子:每一個結點都有一個平衡因子,代表著右子樹(左子樹)高度減去左子樹(右子樹)高度的高度差,AVL樹任一結點的平衡因子只能取-1,0,1。

AVL樹的插入:

向一棵本來是平衡的AVL樹插入時,出現(xiàn)了不平衡,則需要做平衡話處理,使其平衡

平衡化旋轉

1、如單旋轉(左旋和右旋)

2、雙旋轉(左平衡和右平衡)

3、每插入一個新結點時,AVL樹中相關結點的平衡狀態(tài)會發(fā)生改變,因此,需要從插入位置沿通向根的路徑回溯,檢查各結點的平衡因子(左、右子樹的高度差)。

如果在某一結點發(fā)現(xiàn)高度不平衡,停止回溯。

1、從發(fā)生不平衡的結點起,沿剛才回溯的路徑取直接下兩層的結點

2、如果這三個結點處于一條直線上,則采用單旋轉進行平衡化,單旋轉可按其方向分為左單旋和右單旋,其中一個是另一個的鏡像,其方向與不平衡的形狀相關

3、如果這三個結點處于一條折現(xiàn)上,則采用雙旋轉進行平衡化,雙旋轉也分兩種。

左單旋轉

AVL樹(平衡二叉搜索樹)

void RotateLeft(AVLTree* ptree, AVLNode* ptr)//左單旋
{
	assert(ptree != nullptr && ptr != nullptr);
	AVLNode* newroot = ptr->rightchild;
	newroot->parent = ptr->parent;
	ptr->rightchild = newroot->leftchild;
	if (newroot->leftchild != nullptr)
	{
		newroot->leftchild->parent = ptr;
	}
	newroot->leftchild = ptr;
	AVLNode* pa = ptr->parent;
	if (pa == nullptr)
	{
		ptree->root = newroot;
	}
	if (pa->leftchild = ptr)
	{
		pa->leftchild = newroot;
	}
	else
	{
		pa->rightchild = newroot;
	}
	ptr->parent = newroot;
}

右單旋

void RotateRight(AVLTree* ptree, AVLNode* ptr)//右單旋
{
	assert(ptree != nullptr && ptr != nullptr);
	AVLNode* newroot = ptr->leftchild;
	newroot->parent = ptr->parent;
	ptr->leftchild = newroot->rightchild;
	if (newroot->rightchild != nullptr)
	{
		ptr->leftchild->parent = ptr;
	}
	newroot->rightchild = ptr;
	AVLNode* pa = ptr->parent;
	if (pa == nullptr)
	{
		ptree->root = newroot;
	}else
	{
	if (pa->leftchild == ptr)
	{
		pa->leftchild = newroot;
	}
	else
	{
		pa->rightchild = newroot;
	}
	ptr->parent = newroot;
	}
}

雙旋轉

AVL樹(平衡二叉搜索樹)

?

//雙旋轉 分為兩次單旋轉
void LeftBalance(AVLTree* ptree, AVLNode* ptr)//左平衡
{
	assert(ptree != nullptr && ptr != nullptr);
	AVLNode* leftsub = ptr->leftchild, * rightsub = nullptr;
	switch (leftsub -> balance)
	{
	case 0:
		cout << "left banlance!" << endl;
		break;
	case -1:
		ptr->balance = 0;
		leftsub->balance = 0;
		RotateRight(ptree, ptr);
		break;
	case 1:
		rightsub = leftsub->rightchild;
		switch (rightsub->balance)
		{
		case 0:
			ptr->balance = 0;
			leftsub->balance = 0;
			break;
		case 1:
			ptr->balance = 0;
			leftsub->balance = -1;
			break;
		case -1:
			ptr->balance = 1;
			leftsub->balance = 0;
			break;
		}
		rightsub->balance = 0;
		RotateLeft(ptree, leftsub);
		RotateRight(ptree, ptr);
		break;
	}
}
void RightBalance(AVLTree* ptree, AVLNode* ptr)//右平衡
{
	assert(ptree != nullptr && ptr != nullptr);
	AVLNode* rightsub = ptr->rightchild, * leftsub = nullptr;
	switch (rightsub->balance)
	{
	case 0:
		cout << "avl tree right balance" << endl;
		break;
	case 1:
		ptr->balance = 0;
		rightsub->balance = 0;
		RotateLeft(ptree, ptr);
		break;
	case -1:
		leftsub = rightsub->leftchild;
		switch (leftsub->balance)
		{
		case 0: 
			ptr->balance = 0;
			rightsub->balance = 0;
			break;
		case 1:
			ptr->balance = -1;
			rightsub->balance = 0;
			break;
		case -1:
			ptr->balance = 0;
			rightsub->balance = 1;
			break;
		}
		leftsub->balance = 0;
		RotateRight(ptree, rightsub);
		RotateLeft(ptree, ptr); 
		break;
	}
	
}

插入和調整

void Adjust_Insert_Item(AVLTree* ptree, AVLNode* ptr)
{
	assert(ptree != nullptr && ptr != nullptr);
	bool taller = true;
	AVLNode* pa = ptr->parent;
	while (pa != nullptr && taller)
	{
		if (pa->leftchild == ptr)
		{
			switch (pa->balance)
			{
			case 0: pa->balance = -1; break;
			case 1: pa->balance = 0;
				taller = false;
				break;
			case -1:
				LeftBalance(ptree, pa);
				taller = false;
				break;
			}
		}
		else
		{	// ptr pa->rightchild
			switch (pa->balance)
			{
			case 0: pa->balance = 1; break;
			case -1: pa->balance = 0;
				taller = false;
				break;
			case 1:
				RightBalance(ptree, pa);
				taller = false;
				break;
			}
		}
		ptr = pa;
		pa = ptr->parent;
	}
}

bool Insert_Item(AVLTree* ptree, const KeyType kx)
{
	assert(ptree != nullptr);
	AVLNode* ptr = ptree->root, * pa = nullptr;
	while (ptr != nullptr && ptr->key != kx)
	{
		pa = ptr;
		ptr = kx > ptr->key ? ptr->rightchild : ptr->leftchild;
	}
	if (ptr != nullptr && ptr->key == kx) return false;

	ptr = Buynode();
	ptr->key = kx;
	ptr->parent = pa; //
	if (pa != nullptr)
	{
		if (ptr->key > pa->key)
		{
			pa->rightchild = ptr;
		}
		else
		{
			pa->leftchild = ptr;
		}
	}
	else
	{
		ptree->root = ptr;
	}
	Adjust_Insert_Item(ptree, ptr);
	ptree->cursize += 1;
}

刪除

和刪除BST樹結點思路相同,如果是雙分支,則刪除中序遍歷的下一個結點文章來源地址http://www.zghlxwxcb.cn/news/detail-448423.html

到了這里,關于AVL樹(平衡二叉搜索樹)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【C++】map&set的底層結構 -- AVL樹(高度平衡二叉搜索樹)

    【C++】map&set的底層結構 -- AVL樹(高度平衡二叉搜索樹)

    前面我們對 map / multimap / set / multiset 進行了簡單的介紹,可以發(fā)現(xiàn),這幾個容器有個共同點是: 其底層都是按照 二叉搜索樹 來實現(xiàn)的。 但是二叉搜索樹有其自身的缺陷,假如 往樹中插入的元素有序或者接近有序,二叉搜索樹就會退化成單支樹,時間復雜度會退化成 O(N) ,

    2024年02月06日
    瀏覽(20)
  • 【數(shù)據(jù)結構】平衡二叉搜索樹(AVL樹)——AVL樹的概念和介紹、AVL樹的簡單實現(xiàn)、AVL樹的增刪查改

    【數(shù)據(jù)結構】平衡二叉搜索樹(AVL樹)——AVL樹的概念和介紹、AVL樹的簡單實現(xiàn)、AVL樹的增刪查改

    ??為什么要引入平衡二叉搜索樹? ??在之前我們學習了二叉搜索樹,二叉搜索樹的結構類似于一個倒置的樹,而左子樹的值小于根節(jié)點的值,右節(jié)點的值大于根節(jié)點的值,這種結構使得二叉搜索樹在處理有序數(shù)據(jù)時非常高效。但是如果 在傳入的數(shù)據(jù)為有序或接近有序,

    2024年02月07日
    瀏覽(26)
  • C++數(shù)據(jù)結構之平衡二叉搜索樹(一)——AVL的實現(xiàn)(zig與zag/左右雙旋/3+4重構)

    C++數(shù)據(jù)結構之平衡二叉搜索樹(一)——AVL的實現(xiàn)(zig與zag/左右雙旋/3+4重構)

    本文是介紹眾多平衡二叉搜索樹(BBST)的第一篇——介紹AVL樹。故先來引入BBST的概念。由于上一篇介紹的二叉搜索樹(BST)在極度退化的情況下,十分不平衡,不平衡到只朝一側偏,成為一條鏈表,復雜度可達 O ( n ) O(n) O ( n ) ,所以我們要在“平衡”方面做一些約束,以防

    2024年02月13日
    瀏覽(27)
  • 【C++】AVL樹(平衡二叉樹)

    【C++】AVL樹(平衡二叉樹)

    AVL樹,全稱 平衡二叉搜索(排序)樹 。 二叉搜索樹雖可以縮短查找的效率,但如果數(shù)據(jù)有序或接近有序二叉搜索樹將退化為單支樹,查找元素相當于在順序表中搜索元素,效率低下 。因此,兩位俄羅斯的數(shù)學家G.M.Adelson-Velskii和E.M.Landis在1962年發(fā)明了一種解決上述問題的方法

    2024年02月12日
    瀏覽(25)
  • AVL——平衡搜索樹

    AVL——平衡搜索樹

    ?1主頁 :我的代碼愛吃辣 ??2知識講解 :數(shù)據(jù)結構——AVL樹 ??3開發(fā)環(huán)境 :Visual Studio 2022 ??4前言 :AVL樹是對二叉搜索樹的嚴格高度控制,所以AVL樹的搜索效率很高,但是這是需要付出很大的代價的,要維護父親指針,和平衡因子。 目錄 一.AVL的概念 二. AVL樹節(jié)點及整體

    2024年02月11日
    瀏覽(11)
  • 【C++】AVL樹(高度平衡二叉樹)

    【C++】AVL樹(高度平衡二叉樹)

    概念 二叉搜索樹雖然可以縮短查找的效率,但如果數(shù)據(jù)有序或者接近有序二叉搜索樹將退化為單支樹,查找元素相當于在順序表中搜索元素,效率低下。 。因此,兩位俄羅斯的數(shù)學家G.M.Adelson-Velskii和E.M.Landis在1962年發(fā)明了一種解決上述問題的方法:當向二叉搜索樹中插入新

    2024年02月11日
    瀏覽(20)
  • 【數(shù)據(jù)結構與算法】平衡二叉樹(AVL樹)

    【數(shù)據(jù)結構與算法】平衡二叉樹(AVL樹)

    給你一個數(shù)列{1,2,3,4,5,6},要求創(chuàng)建二叉排序樹(BST),并分析問題所在。 BST 存在的問題分析 : 左子樹全部為空,從形式上看,更像一個單鏈表。 插入速度沒有影響。 查詢速度明顯降低(因為需要依次比較),不能發(fā)揮 BST 的優(yōu)勢,因為每次還需要比較左子樹,其查詢速度

    2024年02月13日
    瀏覽(26)
  • 【樹】 二叉樹 堆與堆排序 平衡(AVL)樹 紅黑(RB)樹

    【樹】 二叉樹 堆與堆排序 平衡(AVL)樹 紅黑(RB)樹

    樹是一種非線性的數(shù)據(jù)結構,它是由n(n=0)個有限結點組成一個具有層次關系的集合。 有一個特殊的結點,稱為根結點,根節(jié)點沒有前驅結點 除根節(jié)點外,其余結點被分成M(M0)個互不相交的集合T1、T2、……、Tm,其中每一個集合Ti(1= i= m)又是一棵結構與樹類似的子樹。每棵子

    2024年02月14日
    瀏覽(20)
  • 數(shù)據(jù)結構奇妙旅程之二叉平衡樹進階---AVL樹

    數(shù)據(jù)結構奇妙旅程之二叉平衡樹進階---AVL樹

    ??????? write in front???????? ?????????大家好,我是xiaoxie.希望你看完之后,有不足之處請多多諒解,讓我們一起共同進步????? . ?? ?xiaoxie?????????—CSDN博客 本文由xiaoxie??????????原創(chuàng) CSDN?如需轉載還請通知???? 個人主頁:xiaoxie??

    2024年03月13日
    瀏覽(30)
  • 數(shù)據(jù)結構07:查找[C++][平衡二叉排序樹AVL]

    數(shù)據(jù)結構07:查找[C++][平衡二叉排序樹AVL]

    圖源:文心一言 考研筆記整理1w+字,小白友好、代碼可跑,請小伙伴放心食用~~???? 第1版:查資料、寫B(tài)UG、畫導圖、畫配圖~???? 參考用書: 王道考研《2024年 數(shù)據(jù)結構考研復習指導》 參考用書配套視頻: 7.3_2 平衡二叉樹_嗶哩嗶哩_bilibili 特別感謝: ?Chat GPT老師、文心

    2024年02月11日
    瀏覽(46)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包