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

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

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

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

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

a/b/c分別是高度為h的AVL子樹

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

代碼

//右單旋
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)插入較高右子樹的右側(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)插入較高左子樹的右側(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)插入較高右子樹的左側(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為根的子樹不平衡,即pParent的平衡因子為2或者-2,分以下情況考慮:
1. pParent的平衡因子為2,說明pParent的右子樹高,設(shè)pParent的右子樹的根為pSubR。
當(dāng)pSubR的平衡因子為1時(shí),執(zhí)行左單旋。
當(dāng)pSubR的平衡因子為-1時(shí),執(zhí)行右左雙旋。
2. pParent的平衡因子為-2,說明pParent的左子樹高,設(shè)pParent的左子樹的根為pSubL。
當(dāng)pSubL的平衡因子為-1是,執(zhí)行右單旋。
當(dāng)pSubL的平衡因子為1時(shí),執(zhí)行左右雙旋。
旋轉(zhuǎn)完成后,原pParent為根的子樹個(gè)高度降低,已經(jīng)平衡,不需要再向上更新。

到此這篇關(guān)于C++ AVL樹的兩單旋和兩雙旋的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)C++ AVL樹內(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)庫之std::filesystem 示例詳解

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

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

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

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

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

    這篇文章主要為大家詳細(xì)介紹了如何使用紅黑樹封裝set和map,且必須保證兩種數(shù)據(jù)結(jié)構(gòu)復(fù)用同一棵紅黑樹,且滿足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語言 解決不用+、-、×、÷數(shù)字運(yùn)算符做加法的實(shí)現(xiàn)方法

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

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

    如何優(yōu)雅地使用c語言編寫爬蟲

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

最新評(píng)論

错那县| 西安市| 郯城县| 拉萨市| 兴国县| 额敏县| 阳西县| 康定县| 榆中县| 华阴市| 顺义区| 新民市| 高唐县| 贵阳市| 楚雄市| 定西市| 建始县| 永宁县| 柯坪县| 彰化县| 兰坪| 淮安市| 城固县| 万年县| 峡江县| 珲春市| 两当县| 柳林县| 琼结县| 郧西县| 基隆市| 获嘉县| 邯郸县| 普格县| 如皋市| 汉川市| 吉水县| 大安市| 栖霞市| 双城市| 沁源县|