平衡二叉搜索樹

平衡二叉搜索樹是一種結(jié)構(gòu)平衡的二叉搜索樹雁社,它的每個(gè)結(jié)點(diǎn)的左右兩棵子樹的高度差都不超過一的二叉樹浴井。它可以在平均和最壞情況下都在O({\bf log}n)的時(shí)間復(fù)雜度內(nèi)完成插入、刪除和查詢等操作霉撵。

正常的二叉搜索樹最好可以在O({\bf log} n)的時(shí)間內(nèi)完成查詢等操作磺浙,但是如果二叉樹退化為單鏈表,那么其的搜索效率降低為O(n)徒坡。因此提出了平衡二叉搜索樹撕氧,來保持樹左右兩端深度的平衡。

定義

平衡二叉搜索樹又叫AVL樹喇完,簡(jiǎn)稱為平衡二叉樹伦泥,它需要滿足以下性質(zhì):

  1. 可以為空樹。
  2. 如果不為空樹锦溪,則任意一個(gè)結(jié)點(diǎn)的左子樹和右子樹都是平衡二叉樹不脯,且高度之差的絕對(duì)值不超過1。

為了度量一棵二叉搜索樹是否為平衡二叉搜索樹引入了平衡因子刻诊,它是表示某結(jié)點(diǎn)左子樹和右子樹高度的差防楷,平衡二叉樹中不存在平衡因子絕對(duì)值大于1的結(jié)點(diǎn)。

失衡調(diào)整

了解平衡調(diào)整策略之前先引入一個(gè)最小失衡子樹的概念:在新插入的結(jié)點(diǎn)向上查找则涯,以第一個(gè)平衡因子的絕對(duì)值超過1的結(jié)點(diǎn)為根的子樹复局。平衡二叉樹的失衡調(diào)整主要通過旋轉(zhuǎn)最小失衡子樹實(shí)現(xiàn)的(旋轉(zhuǎn)的目的是為了調(diào)整左右子樹的高度,哪棵子樹高哪棵子樹向上旋轉(zhuǎn))是整。旋轉(zhuǎn)常見的兩種方法為左旋右旋肖揣。

左旋

平衡二叉搜索樹-01.png

如上圖所式,插入99結(jié)點(diǎn)之后不再滿足二叉平衡樹的性質(zhì)浮入,此時(shí)最小失衡子樹為以66結(jié)點(diǎn)為根的二叉樹龙优,對(duì)其進(jìn)行以下左旋操作:

  1. 右孩子代替最小失衡子樹根所在的位置(77代替66的位置)
  2. 右孩子的左子樹變?yōu)樵撟訕涓挠易訕洌?5的父結(jié)點(diǎn)改為66,作為右孩子)
  3. 原來的根節(jié)點(diǎn)作為新子樹根的左孩子(66的父節(jié)點(diǎn)改為77事秀,作為左孩子)
平衡二叉搜索樹-02.png

右旋

平衡二叉搜索樹-03.png

如上圖所式彤断,插入43結(jié)點(diǎn)之后不再滿足二叉平衡樹的性質(zhì),此時(shí)最小失衡子樹為以66結(jié)點(diǎn)為根的二叉樹易迹,對(duì)其進(jìn)行以下右旋操作:

  1. 左孩子代替最小失衡子樹根所在的位置(60代替66的位置)
  2. 左孩子的右子樹變?yōu)樵撟訕涓淖笞訕洌?3的父結(jié)點(diǎn)改為66S宰衙,作為左孩子)
  3. 原來的根節(jié)點(diǎn)作為新子樹根的右孩子(66的父節(jié)點(diǎn)改為60,作為右孩子)
平衡二叉搜索樹-04.png

不同破壞平衡方式的調(diào)整方式

一般情況下睹欲,假設(shè)由于在二叉排序樹上插入結(jié)點(diǎn)而失去平衡的最小子樹根結(jié)點(diǎn)的指針為A(即A是離插入結(jié)點(diǎn)最近供炼,且平衡因子絕對(duì)值不超過1的祖先結(jié)點(diǎn))一屋,則失去平衡后進(jìn)行調(diào)整的規(guī)律可以歸納為一下4種情況:

  1. A左子樹根節(jié)點(diǎn)的左子樹上插入結(jié)點(diǎn)而破壞平衡(LL):使用單向右旋平衡方法。
  2. A右子樹根節(jié)點(diǎn)的右子樹上插入結(jié)點(diǎn)而破壞平衡(RR):使用單向左旋平衡方法袋哼。
  3. A左子樹根節(jié)點(diǎn)的右子樹上插入結(jié)點(diǎn)而破壞平衡(LR):使用先左旋后右旋的平衡處理方法冀墨。
  4. A右子樹根結(jié)點(diǎn)的左子樹上插入結(jié)點(diǎn)而破壞平衡(RL):使用先右旋后左旋的平衡處理方法。

LL

該示例可以看此前失衡調(diào)整的右旋涛贯。

RR

該示例可以看此前失衡調(diào)整的左旋诽嘉。

LR

平衡二叉搜索樹-05.png

如上圖所示,插入65結(jié)點(diǎn)之后弟翘,不再是二叉平衡虫腋,此時(shí)再單純進(jìn)行右旋不能使樹重新平衡,因進(jìn)行以下操作:

  1. 對(duì)失衡節(jié)點(diǎn)的左孩子進(jìn)行左旋操作(60為根進(jìn)行左旋)
  2. 對(duì)失衡節(jié)點(diǎn)做右旋操作(66為根進(jìn)行右旋)

第一步:

平衡二叉搜索樹-06.png

第二步:

平衡二叉搜索樹-07.png

RL

平衡二叉搜索樹-08.png

如上圖所示稀余,插入76結(jié)點(diǎn)之后悦冀,不再是二叉平衡,此時(shí)再單純進(jìn)行左旋不能使樹重新平衡睛琳,因進(jìn)行以下操作:

  1. 對(duì)失衡節(jié)點(diǎn)的右孩子進(jìn)行右旋操作雏门。(77為根進(jìn)行右旋)
  2. 對(duì)失衡節(jié)點(diǎn)66做左旋操作(66為根進(jìn)行左旋)

第一步:

平衡二叉搜索樹-09.png

第二步:

平衡二叉搜索樹-10.png

總結(jié)

  1. 在所有的不平衡情況中,都是按照先尋找最小不平衡樹掸掏,然后尋找所屬的不平衡類別,再根據(jù)4種類別進(jìn)行固定化程序的操作宙帝。
  2. 在LR和RL中如果進(jìn)行第一次旋轉(zhuǎn)之后不論有沒有出現(xiàn)新的最小平衡樹丧凤,下一次調(diào)整的還是最初最小平衡樹的根節(jié)點(diǎn)。

刪除操作

這一部分我沒有找到很好的文獻(xiàn)步脓,希望有知道的同學(xué)們推薦一下愿待,下面是我對(duì)平衡二叉搜索樹刪除的理解。有錯(cuò)誤可以指出靴患,我修改一下仍侥。

上面講的都是平衡二叉搜索樹的插入。而平衡二叉搜索樹的刪除操作和二叉搜索樹的刪除一致鸳君,都有以下情況:

  1. 如果結(jié)點(diǎn)沒有孩子結(jié)點(diǎn)农渊,則直接刪除該結(jié)點(diǎn),并從刪除結(jié)點(diǎn)的父結(jié)點(diǎn)開始檢查并調(diào)整或颊。
  2. 如果結(jié)點(diǎn)只有左子樹或者右子樹中的一個(gè)砸紊,則直接將該子樹移到被刪除結(jié)點(diǎn)的位置,并從子樹頂結(jié)點(diǎn)開始向上檢查并調(diào)整囱挑。
  3. 如果結(jié)點(diǎn)擁有兩個(gè)子樹醉顽,則用后繼或者先驅(qū)結(jié)點(diǎn)取代被刪除的結(jié)點(diǎn),并從后繼或者先驅(qū)結(jié)點(diǎn)的父節(jié)點(diǎn)開始檢查并調(diào)整平挑。

參考文獻(xiàn):

  1. 什么是平衡二叉樹(AVL)
  2. JAVA實(shí)現(xiàn)平衡二叉樹(AVL)——有源碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末游添,一起剝皮案震驚了整個(gè)濱河市系草,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唆涝,老刑警劉巖找都,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異石抡,居然都是意外死亡檐嚣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門啰扛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚎京,“玉大人,你說我怎么就攤上這事隐解“暗郏” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵煞茫,是天一觀的道長(zhǎng)帕涌。 經(jīng)常有香客問我,道長(zhǎng)续徽,這世上最難降的妖魔是什么蚓曼? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮钦扭,結(jié)果婚禮上纫版,老公的妹妹穿的比我還像新娘。我一直安慰自己客情,他們只是感情好其弊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膀斋,像睡著了一般梭伐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仰担,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天糊识,我揣著相機(jī)與錄音,去河邊找鬼惰匙。 笑死技掏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的项鬼。 我是一名探鬼主播哑梳,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绘盟!你這毒婦竟也來了鸠真?” 一聲冷哼從身側(cè)響起悯仙,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吠卷,沒想到半個(gè)月后锡垄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祭隔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年货岭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾渴。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡千贯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搞坝,到底是詐尸還是另有隱情搔谴,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布桩撮,位于F島的核電站敦第,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏店量。R本人自食惡果不足惜芜果,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望融师。 院中可真熱鬧师幕,春花似錦、人聲如沸诬滩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疼鸟。三九已至,卻和暖如春庙曙,著一層夾襖步出監(jiān)牢的瞬間空镜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工捌朴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吴攒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓砂蔽,卻偏偏與公主長(zhǎng)得像洼怔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子左驾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容