最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?AVL樹(shù)的兩單旋和兩雙旋的項(xiàng)目實(shí)踐

 更新時(shí)間:2024年03月20日 09:49:41   作者:敲敲er  
本文主要介紹了C++?AVL樹(shù)的兩單旋和兩雙旋的項(xiàng)目實(shí)踐,根據(jù)節(jié)點(diǎn)插入位置的不同,AVL樹(shù)的旋轉(zhuǎn)分為四種,下面就來(lái)介紹一下,感興趣的可以了解一下

如果在一棵原本是平衡的AVL樹(shù)中插入一個(gè)新節(jié)點(diǎn),可能造成不平衡,此時(shí)必須調(diào)整樹(shù)的結(jié)構(gòu),使之平衡化。根據(jù)節(jié)點(diǎn)插入位置的不同,AVL樹(shù)的旋轉(zhuǎn)分為四種。

1. 新節(jié)點(diǎn)插入較高左子樹(shù)的左側(cè)---左左:右單旋

a/b/c分別是高度為h的AVL子樹(shù)

上圖在插入前,AVL樹(shù)是平衡的,新節(jié)點(diǎn)插入到30的左子樹(shù)(注意:此處不是左孩子)中,30左子樹(shù)增加了一層,導(dǎo)致以60為根的二叉樹(shù)不平衡,要讓60平衡,只能將60左子樹(shù)的高度減少一層,右子樹(shù)增加一層,即將左子樹(shù)往上提,這樣60轉(zhuǎn)下來(lái),因?yàn)?0比30大,只能將其放在30的右子樹(shù),而如果30有右子樹(shù),右子樹(shù)根的值一定大于30,小于60,只能將其放在60的左子樹(shù),旋轉(zhuǎn)完成后,更新節(jié)點(diǎn)的平衡因子即可。在旋轉(zhuǎn)過(guò)程中,有以下幾種情況需要考慮:
1. 30節(jié)點(diǎn)的右孩子可能存在,也可能不存在
2. 60可能是根節(jié)點(diǎn),也可能是子樹(shù)
如果是根節(jié)點(diǎn),旋轉(zhuǎn)完成后,要更新根節(jié)點(diǎn)
如果是子樹(shù),可能是某個(gè)節(jié)點(diǎn)的左子樹(shù),也可能是右子樹(shù)

代碼

//右單旋
void RotateR(Node* parent)
{
	Node* SubL = parent->_left;
	Node* subLR = subL->_right;

	parent->_left = subLR;
	if (subLR)
	{
		subL->_right = parent;
	}

	subL->_right = parent;
	Node* ppnode = parent->_parent;
	parent->_parent = subL;

	if (parent == _root)
	{
		_root = subL;
		subL->_parent = nullptr;
	}
	else
	{
		if (ppnode->_left == parent)
		{
			ppnode->_left = subL;
		}
		else
		{
			ppnode->_right = subL;
		}
		subL->_parent = ppnode;
	}
	parent->_bf = 0;
	subL->_bf = 0;
}

2. 新節(jié)點(diǎn)插入較高右子樹(shù)的右側(cè)---右右:左單旋

左單旋與右單旋的操作類似,只有左右節(jié)點(diǎn)的區(qū)別

 代碼

//左單旋
void RotateL(Node* parent)
{
	Node* SubR = parent->_right;
	Node* subRL = subR->_left;

	parent->_right = subRL;
	if (subRL)
	{
		subR->_left = parent;
	}

	subR->_left = parent;
	Node* ppnode = parent->_parent;
	parent->_parent = subR;

	if (parent == _root)
	{
		_root = subR;
		subR->_parent = nullptr;
	}
	else
	{
		if (ppnode->_left == parent)
		{
			ppnode->_left = subR;
		}
		else
		{
			ppnode->_right = subR;
		}
		subR->_parent = ppnode;
	}
	parent->_bf = 0;
	subR->_bf = 0;
	
}

3. 新節(jié)點(diǎn)插入較高左子樹(shù)的右側(cè)---左右:先左單旋再右單旋

參考30和60的相對(duì)位置,將雙旋變成單旋后再旋轉(zhuǎn),即:先對(duì)30進(jìn)行左單旋,然后再對(duì)90進(jìn)行右單旋,旋轉(zhuǎn)完成后再考慮平衡因子的更新。

代碼 

//左右單旋
void RotateLR(Node* parent)
{
	Node* subL = parent->_left;
	Node* subLR = subL->_right;
	int bf = subLR->_bf;
	RotateL(parent->_left);
	RotateR(parent);

	if (bf == 1)
	{
		parent->_bf = 0;
		subL->_bf = 0;
		subLR->_bf = 1;
	}
	else if (bf == -1)
	{
		parent->_bf = 0;
		subL->_bf = -1;
		subLR->_bf = 0;
	}
	else if(bf==0)
	{
		parent->_bf = 0;
		subL->_bf = 0;
		subLR->_bf = 0;
	}
	else
	{
		assert(false);
	}
}

4. 新節(jié)點(diǎn)插入較高右子樹(shù)的左側(cè)---右左:先右單旋再左單旋

代碼

//右左單旋
void RotateRL(Node* parent)
{
	Node* subR = parent->_right;
	Node* subRL = subR->_left;
	int bf = subRL->_bf;
	RotateR(parent->_right);
	RotateL(parent);

	if (bf == 1)
	{
		parent->_bf = 0;
		subR->_bf = 0;
		subRL->_bf = 1;
	}
	else if (bf == -1)
	{
		parent->_bf = 0;
		subR->_bf = -1;
		subRL->_bf = 0;
	}
	else if (bf == 0)
	{
		parent->_bf = 0;
		subR->_bf = 0;
		subRL->_bf = 0;
	}
	else
	{
		assert(false);
	}
}

總結(jié):
假如以pParent為根的子樹(shù)不平衡,即pParent的平衡因子為2或者-2,分以下情況考慮:
1. pParent的平衡因子為2,說(shuō)明pParent的右子樹(shù)高,設(shè)pParent的右子樹(shù)的根為pSubR。
當(dāng)pSubR的平衡因子為1時(shí),執(zhí)行左單旋。
當(dāng)pSubR的平衡因子為-1時(shí),執(zhí)行右左雙旋。
2. pParent的平衡因子為-2,說(shuō)明pParent的左子樹(shù)高,設(shè)pParent的左子樹(shù)的根為pSubL。
當(dāng)pSubL的平衡因子為-1是,執(zhí)行右單旋。
當(dāng)pSubL的平衡因子為1時(shí),執(zhí)行左右雙旋。
旋轉(zhuǎn)完成后,原pParent為根的子樹(shù)個(gè)高度降低,已經(jīng)平衡,不需要再向上更新。

到此這篇關(guān)于C++ AVL樹(shù)的兩單旋和兩雙旋的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)C++ AVL樹(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 兩個(gè)vector對(duì)象拼接方式

    C++ 兩個(gè)vector對(duì)象拼接方式

    這篇文章主要介紹了C++ 兩個(gè)vector對(duì)象拼接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++11中的lambda表達(dá)式與包裝器

    C++11中的lambda表達(dá)式與包裝器

    C++11中l(wèi)ambda是匿名函數(shù),可捕獲外部變量,std::function統(tǒng)一存儲(chǔ)可調(diào)用對(duì)象,bind調(diào)整參數(shù)順序和數(shù)量,兩者簡(jiǎn)化了函數(shù)對(duì)象的使用,本文給大家介紹C++11中的lambda表達(dá)式與包裝器,感興趣的朋友一起看看吧
    2025-07-07
  • 基于QT繪制一個(gè)漂亮的預(yù)警儀表

    基于QT繪制一個(gè)漂亮的預(yù)警儀表

    這篇文章主要為大家詳細(xì)介紹了如何基于QT繪制一個(gè)漂亮的預(yù)警儀表,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-04-04
  • C++17文件系統(tǒng)庫(kù)之std::filesystem 示例詳解

    C++17文件系統(tǒng)庫(kù)之std::filesystem 示例詳解

    std::filesystem是C++17引入的一個(gè)強(qiáng)大且易用的文件系統(tǒng)操作庫(kù),它提供了跨平臺(tái)的文件系統(tǒng)操作接口,簡(jiǎn)化了文件和目錄操作的代碼實(shí)現(xiàn),本文給大家介紹C++17文件系統(tǒng)庫(kù)之std::filesystem 示例詳解,感興趣的朋友一起看看吧
    2025-03-03
  • win10環(huán)境下vscode Linux C++開(kāi)發(fā)代碼自動(dòng)提示配置(基于WSL)

    win10環(huán)境下vscode Linux C++開(kāi)發(fā)代碼自動(dòng)提示配置(基于WSL)

    這篇文章主要介紹了win10環(huán)境下vscode Linux C++開(kāi)發(fā)代碼自動(dòng)提示配置(基于WSL),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C++紅黑樹(shù)應(yīng)用之手搓set和map

    C++紅黑樹(shù)應(yīng)用之手搓set和map

    這篇文章主要為大家詳細(xì)介紹了如何使用紅黑樹(shù)封裝set和map,且必須保證兩種數(shù)據(jù)結(jié)構(gòu)復(fù)用同一棵紅黑樹(shù),且滿足set和map的性質(zhì),set的value不可被改變,而map的value可以被改變,需要的可以參考一下
    2023-03-03
  • C++?關(guān)聯(lián)式容器map?與?set?的原理與實(shí)踐操作

    C++?關(guān)聯(lián)式容器map?與?set?的原理與實(shí)踐操作

    本文將詳細(xì)介紹關(guān)聯(lián)式容器中最常用的map和set,包括它們的底層實(shí)現(xiàn)、核心特性、使用方法及實(shí)際應(yīng)用,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • 詳解C++字符串常用操作函數(shù)(查找、插入、截取、刪除等)

    詳解C++字符串常用操作函數(shù)(查找、插入、截取、刪除等)

    這篇文章主要介紹了C++字符串常用操作函數(shù)(查找、插入、截取、刪除等),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • C語(yǔ)言 解決不用+、-、×、÷數(shù)字運(yùn)算符做加法的實(shí)現(xiàn)方法

    C語(yǔ)言 解決不用+、-、×、÷數(shù)字運(yùn)算符做加法的實(shí)現(xiàn)方法

    本篇文章是對(duì)在C語(yǔ)言中解決不用+、-、×、÷數(shù)字運(yùn)算符做加法的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 如何優(yōu)雅地使用c語(yǔ)言編寫(xiě)爬蟲(chóng)

    如何優(yōu)雅地使用c語(yǔ)言編寫(xiě)爬蟲(chóng)

    如何優(yōu)雅地使用c語(yǔ)言編寫(xiě)爬蟲(chóng),本文介紹cspider爬蟲(chóng)庫(kù),這個(gè)cspider爬蟲(chóng)庫(kù)的使命在于,我們能夠使用c語(yǔ)言,依然能夠優(yōu)雅地編寫(xiě)爬蟲(chóng)程序,需要的朋友可以參考下
    2015-12-12

最新評(píng)論

大城县| 灵宝市| 乐安县| 东兴市| 思茅市| 商河县| 阜新市| 城步| 广汉市| 灌云县| 丹凤县| 东山县| 祁连县| 宜都市| 积石山| 九台市| 台山市| 梁平县| 安康市| 彭水| 鄂托克前旗| 隆回县| 贡觉县| 张家口市| 龙江县| 广州市| 图木舒克市| 阿克苏市| 奉化市| 隆德县| 长岛县| 余干县| 肥西县| 谷城县| 阿克苏市| 蕲春县| 东港市| 新巴尔虎左旗| 青冈县| 桃园市| 彝良县|