天天看點

16平衡樹

平衡樹,又稱AVL樹。(以前蘇聯學者Adelson-Velskii和Landis的名字命名)

定義:所有結點的平衡因子絕對值≤1的二叉樹(高度h控制在結點數n的對數範圍之内              h≤O(logn)的樹都屬于平衡樹(balanced tree))。

平衡因子:右子樹的高hR與v的左子樹高hL之差hR-hL 。

AVL樹各點的平衡因子:隻能是0、1、-1。

性質:高度h≤1.45log2n (n是結點數)

16平衡樹

換句話說,以某一點為根結點,再以其右子樹的高度減去其左子樹的高度。其值隻能是0,-1,1。

比如:

16平衡樹

最頂端是根結點,其右邊高度減左邊高度,是以其根結點的平衡因子為0。

一、插入引起的旋轉

(1)插入操作的大體步驟

步驟1) 像一般的檢索樹那樣插入x(新葉)

步驟2)沿插入x的路線傳回,修改x祖先的平衡因子

步驟3) 回溯中,一旦發現x的祖先p失衡

由p->bal=1   變成    p->bal=2

由p->bal=-1  變成   p->bal=-2

旋轉以p為根的子樹,使之平衡

(2)平衡因子變化情況分析

x插在p的左子樹上,且使p的左子樹高度增1

當傳回路線沿左路到達p時 ,插入前 :

p->bal=0(hR=hL=h)

p->bal=1(hR=h,hL=h-1 )

p->bal=-1(hR=h,hL=h+1 )

(3)旋轉方法

前提(左子樹) :p->bal=-1 變為 p->bal=-2

1. LL單旋:p的左兒子作根

2. LR雙旋:p的孫子作根

前提(右子樹) :p->bal=+1 變為 p->bal=+2

1.RR單旋:p的右兒子作根

2.RL雙旋:p的孫子作根

LL單旋

具體情況及方法:

情況:x插在p的左兒子p1的左子樹上,使p1的左子樹升高,繼而引起p1點升高

    插入x前,p1->bal=0;

    插入x 使p1的左子樹升高,p1->bal變為-1

現沿左路到達p1,又沿左路到達p。

旋轉方法:

(1)使p1作為子樹之根

(2) p作p1的右兒子;p1的右兒子作p的左兒子

旋轉後:p子樹高度沒有增加,停止回溯

16平衡樹
16平衡樹

LR雙旋

情況:x插在p的左兒子p1的右子樹上,使p1的右子樹升高,繼而引起p1點升高

    插入x 使p1的右子樹升高,p1->bal變為1

現沿右路到達p1,又沿左路到達p

 (1)p2作為子樹之根

 (2)p1和p分别作p2的左右兒子

 (3)p2的原左右兒子分别作p1的右兒子和p的左兒子

16平衡樹
16平衡樹

結論:

1.插入一個結點,至多旋轉一次

2.從右路傳回到p的處理完全對稱(旋轉:RR單旋、RL雙旋)

3.“左”都換成“右”,“右”都換成“左”

4.正号都換成負号,負号都換成正号

RR單旋

(2) p作p1的左兒子;p1的右兒子作p的左兒子

16平衡樹

RL雙旋

 (2)p和p1分别作p2的左右兒子

16平衡樹

構造AVL樹執行個體

16平衡樹

步驟:

1.按照構造有序二叉樹的方法(左小右大),構造有序二叉樹。

2.按照上述方法,使用哪種旋轉方法。可能要使用多種的結合,不局限于一種。

二、删除引起旋轉

(1)删除結點x的大體步驟:

步驟1)用一般檢索樹的删除算法找到并删除結點x,x有兩個兒子時,被删除的是x的中序前趨。

步驟2)沿根到被删除結點的路線之逆逐層向上回溯,檢查該路線上各結點的平衡因子是否變化,如果變化,則及時修改。

步驟3)若發現某結點p的平衡因子,由p->bal=1變成p->bal=2,或由p->bal=-1變成p->bal=-2(失衡),則旋轉以p為根的子樹結構,恢複平衡。

如果旋轉後子樹高度還降低,要繼續回溯。

在p的左子樹上删除,使p的左子樹高度降1。

删除前p的平衡因子(分三種情況)

p->bal=-1

p->bal=0

p->bal=+1 

總結:

1.p->bal=-1  

          p->bal變為0,樹高降低,回溯

2.p->bal=0  

          p->bal變為-1,樹高不變,平衡

3.p->bal=+1   

          p->bal變為+2,旋轉

情況:在p的左子樹上删除,使p的左子樹高度降1

       删除前,p->bal=+1;

       删除後,p->bal變為+2

考慮:p的右兒子p1的平衡因子。

p1->bal=0                        

p1->bal=+1      

p1->bal=-1

16平衡樹
16平衡樹
16平衡樹

旋轉方法(結論):

情況:在p的左子樹上删除使p的左子樹高度降1

       删除前,p->bal=+1

       删除後,p->bal變為+2  

考慮:p的右兒子p1的平衡因子

p1->bal=0         RR單旋    平衡           

p1->bal=+1       RR單旋    樹高降低

p1->bal=-1        RL雙旋     樹高降低

旋轉後:子樹高度如果降低,繼續回溯

删除示例:

16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹
16平衡樹

删除示例2

16平衡樹
16平衡樹
16平衡樹

繼續閱讀