簡析AVL樹--AVL樹的概念及單旋轉

什麼是AVL樹?

目錄:
簡析AVL樹–AVL樹的概念及單旋轉(本文)
潛析AVL樹–AVL樹的雙旋轉
潛析AVL樹–AVL樹的C++實現
AVL樹(平衡二叉樹)是一種帶有平衡條件的查找二叉樹。一般來說,要求一棵AVL樹的左右子樹高度最多相差1。如下圖所示,下面是一個平衡了的AVL樹,它的每一個結點的左右子樹高度最多相差1。
平衡的AVL樹

當我們插入了新結點1之後,這棵就不是平衡二叉樹了,因爲它的根節點左右子樹高度相差2:
不平衡的二叉樹

AVL樹如何恢復平衡之單旋轉

我們可以觀察到之所以引起了不平衡是因爲新插入的結點1破環了根節點的平衡性,使得根節點左右子樹相差2。對於上述的情況,我們可以想辦法使得根節點的左子樹的高度減一,如下圖所示,我們讓結點3和結點6繞着旋轉軸“旋轉”一下,讓已經不平衡的根節點的 左子樹做爲新的根節點,就可以讓這棵二叉樹重新平衡:
LL單旋轉
請注意,由於結點3的右子樹在旋轉完成後被結點6佔用,因此結點3的原右子樹–結點4在旋轉完成之後做了結點6的左子樹(結點6的左子樹在旋轉完成之後左子樹空了出來)。這樣旋轉完成之後,我們發現整棵樹在繼續保持查找二叉樹的性質的同時重新平衡了。

上面的旋轉我們稱之爲LL單旋轉----LL的意思是原二叉樹失衡的原因是因爲在根節點的左兒子(L)的左子樹(L)上插入了新結點。

根據上面的討論,我們可以總結出執行LL單旋轉的僞代碼:

void LL單旋轉(當前指向的結點指針) //對應於上圖,目前指向的是已經失衡的根結點6
{
	備份當前結點指針的左子樹指針;//對於於上圖,備份的是上圖的結點6指向結點3的指針
	將備份指針指向的結點的右子樹指針賦給當前結點的左指針;//對應於上圖,將結點4賦給結點6做左兒子
	將當前結點指針賦給備份指針的右指針;//對應於上圖,對結點對3-6左旋轉
	更新左右子樹的高度信息;//由於結點結構改變,所以必須重新計算高度信息
	返回新的結點指針爲備份的指針;//對應於上圖,當前指針變爲了原來結點的左兒子來維持平衡
}

在上述二叉樹我們繼續插入新結點9,我們發現這棵二叉樹並沒有失衡:
插入結點9之後
但是我們繼續嘗試插入結點10,我們發現這個二叉樹再次去失平衡----這次失去平衡的原因是在結點8的右兒子(R)(結點9)的右子樹(R)插入的新結點10,導致結點8的左右子樹高度相差2:
二叉樹再次失衡
這時我們需要做一個RR單旋轉讓整個二叉樹再次恢復平衡:
RR單旋轉
同樣的,可以總結出執行RR單旋轉的僞代碼:

void RR單旋轉(當前指向的結點指針) //對應於上面的結點8
{
	備份當前結點指針的右子樹指針;//對於於上圖,備份的是上圖的結點8指向結點9的指針
	將備份指針指向的結點的左子樹指針賦給當前結點的右指針;
	將當前結點指針賦給備份指針的左指針;//對應於上圖,對結點對8-9右旋轉
	更新左右子樹的高度信息;//由於結點結構改變,所以必須重新計算高度信息
	返回新的結點指針爲備份的指針;//對應於上圖,當前指針變爲了原來結點的右兒子來維持平衡
}
發佈了16 篇原創文章 · 獲贊 2 · 訪問量 6990
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章