資料結構知識整理 - 平衡二叉樹
平衡二叉樹(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)平衡調整演算法:修改相關結點的指標。