11.5平衡二叉樹(AVL樹)
內(nèi)容來自尚硅谷Java數(shù)據(jù)結(jié)構(gòu)與java算法(Java數(shù)據(jù)結(jié)構(gòu)與算法)_嗶哩嗶哩_bilibili
寫在前面:本文內(nèi)容大致和原視頻內(nèi)老師的筆記內(nèi)容相同,會(huì)偶爾插入自己的注釋和理解,盡量會(huì)完成作業(yè)
11.5平衡二叉樹(AVL樹)
11.5.1看一個(gè)案例(說明二叉排序樹可能的問題)
給你一個(gè)數(shù)列{1,2,3,4,5,6},要求創(chuàng)建一棵二叉排序樹(BST),并分析問題所在
左子樹全部為空,從形式上看,更像一個(gè)單鏈表
1.????? 插入速度沒有影響
2.????? 查詢速度明顯降低(因?yàn)樾枰来伪容^)。
3.????? 不能發(fā)揮BST的優(yōu)勢,因?yàn)槊看芜€需要比較左子樹,其查詢速度比單鏈表還慢,
4.????? 解決方案-平衡二叉樹(AVL)
11.5.2基本介紹
1.????? 平衡二叉樹也叫平衡二叉搜索樹(Self-balancing binary search tree)又被稱為AVL樹,可以保證查詢效率較高。
2.????? 具有以下特點(diǎn):它是一棵空樹或它的左右兩個(gè)子樹的高度差的絕對(duì)值不超過1,并且左右兩個(gè)子樹都是一棵平衡二叉樹。平衡二叉樹的常用實(shí)現(xiàn)方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹等。
3.????? 舉例說明,看看下面哪些AVL樹,為什么?

11.5.3應(yīng)用案例-單旋轉(zhuǎn)(左旋轉(zhuǎn))
要求:給你一個(gè)數(shù)列,創(chuàng)建出對(duì)應(yīng)的平衡二叉樹.數(shù)列{4,3,6,5,7,8}
思路分析(示意圖)



代碼實(shí)現(xiàn)
11.5.4應(yīng)用案例-單旋轉(zhuǎn)(右旋轉(zhuǎn))
要求:給你一個(gè)數(shù)列,創(chuàng)建出對(duì)應(yīng)的平衡二叉樹.數(shù)列{10,12,8,9,7,6}
思路分析(示意圖)



代碼實(shí)現(xiàn)
11.5.5應(yīng)用案例-雙旋轉(zhuǎn)
前面的兩個(gè)數(shù)列,進(jìn)行單旋轉(zhuǎn)(即一次旋轉(zhuǎn))就可以將非平衡二叉樹轉(zhuǎn)成平衡二叉樹,但是在某些情況下,單旋轉(zhuǎn)不能完成平衡二叉樹的轉(zhuǎn)換。比如數(shù)列
int[]arr = { 10,11,7,6,8,9};運(yùn)行原來的代碼可以看到,并沒有轉(zhuǎn)成AVL樹.
int[]arr= {2,1,6,5,7,3};//運(yùn)行原來的代碼可以看到,并沒有轉(zhuǎn)成AVL樹
1.問題分析

2.解決思路分析
(1)當(dāng)符號(hào)右旋轉(zhuǎn)的條件時(shí)
(2)如果它的左子樹的右子樹高度大于它的左子樹的高度
(3)先對(duì)當(dāng)前這個(gè)結(jié)點(diǎn)的左節(jié)點(diǎn)進(jìn)行左旋轉(zhuǎn)
(4)在對(duì)當(dāng)前結(jié)點(diǎn)進(jìn)行右旋轉(zhuǎn)的操作即可
代碼實(shí)現(xiàn)(AVL樹的完整匯總代碼)