1. 程式人生 > >資料結構知識整理 - 平衡二叉樹

資料結構知識整理 - 平衡二叉樹

平衡二叉樹(Balanced Binary Tree)

平衡二叉樹是由一般的二叉排序樹經過平衡調整得到的,每個結點的左右子樹深度差小於等於1的特殊的二叉排序樹。

已經提到,二叉排序樹的平均查詢長度與它的形態有關,其中平衡二叉樹就是一種最好的形態。

特徵:

1)左右子樹深度差的絕對值小於等於1;

2)左右子樹也是平衡二叉樹。(遞迴)

 

為了表示左右子樹的深度差,我們給每個結點增加一個屬性——平衡因子(Balance Factor),記錄每個結點左右子樹的深度差,結點值 = 左子樹深度 - 右子樹深度。只要有一個結點的平衡因子的絕對值大於1,這棵二叉排序樹就是不平衡的。

當平衡的二叉排序樹因插入結點而失去平衡時,僅需對最小不平衡子樹進行平衡調整即可,即 以 離插入結點最近的,結點平衡因子等於2或-2的結點 為根結點的 子樹。

 

插入結點的情況分為四種,相應地,平衡調整的方法也分為四種:

根結點只表示一個位置,其餘顏色代表具體的結點)

1)在根結點左子樹根結點左子樹上插入結點(LL型):

左子樹根結點的左子樹相當於樹的“外層”,對此情況只需要將根結點左移(不違反二叉排序樹的特徵),即左子樹根結點作為新的根結點。但是左子樹根結點上可能存在右子樹,如果只是簡單地將根結點左移,可能會出現三叉樹的情況。所以我們將左子樹根結點

上的右子樹掛接到原來的根結點上。

 

2)在根結點右子樹根結點右子樹上插入結點(RR型):

這種情況與LL型的平衡調整對稱。

 

3)在根結點左子樹根結點右子樹上插入結點(LR型):

左子樹根結點的右子樹相當於樹的“內層”,對此情況需要新增一個操作結點,即根結點的左子樹根結點的右子樹根結點

由於根結點左移並不能改變左右子樹的深度差,所以我們應該設法將插入結點“擡上去”。

具體操作是將右子樹根結點變成新的根結點

右子樹根結點存在左子樹(LRL型),則將其左子樹掛接到左子樹根結點上;若右子樹根結點存在右子樹(LRR型),則將其右子樹掛接到根結點

上。

 

4)在根結點右子樹根結點左子樹上插入結點(RL型):

這種情況與LL型的平衡調整對稱。

新增一個操作結點——根結點的右子樹根結點的左子樹根結點,並將左子樹根結點變成新的根結點

左子樹根結點存在左子樹(RLL型),則將其左子樹掛接到根結點上;若左子樹根結點存在右子樹(RLR型),則將其右子樹掛接到右子樹根結點上。

 

<平衡調整演算法的思路>

(回顧二叉排序樹演算法

1)插入演算法:在二叉排序樹上插入新結點;

2)查詢演算法:判斷插入結點的情況;

3)平衡調整演算法:修改相關結點的指標。