平衡二叉樹的實現原理

2021-07-04 16:27:37 字數 2577 閱讀 6596

1.概念

平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度盡可能小,因此,樹中每個結點的兩棵子樹的深度不要偏差太大。

平衡二叉樹的遞迴定義:平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質:①左右子樹深度之差的絕對值不大於1。②左右子樹都是平衡二叉樹。

平衡因子的概念:結點的平衡因子 = 結點的左子樹深度 —

結點的右子樹深度。

最低不平衡結點的概念:用a表示最低不平衡結點,則a的祖先結點可能有不平衡的,但其所有後代結點都是平衡的。

2.平衡化的實現

整個實現過程是通過在一棵平衡二叉樹中依次插入元素(按照二叉排序樹的方式),若出現不平衡,則要根據新插入的結點與最低不平衡結點的位置關係進行相應的調整。分為ll型、rr型、lr型和rl型4種型別,各調整方法如下(下面用a表示最低不平衡結點):

(1)ll型調整:

由於在a的左孩子(l)的左子樹(l)上插入新結點,使原來平衡二叉樹變得不平衡,此時a的平衡因子由1增至2。下面圖1是ll型的最簡單形式。顯然,按照大小關係,結點b應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡,a結點就好像是繞結點b順時針旋轉一樣。

圖1  最簡單的ll型調整

ll型調整的一般形式如下圖2所示,表示在a的左孩子b的左子樹bl(不一定為空)中插入結點(圖中陰影部分所示)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將a的左孩子b提公升為新的根結點;②將原來的根結點a降為b的右孩子;③各子樹按大小關係連線(bl和ar不變,br調整為a的左子樹)。

圖2  一般形式的

ll型調整

(2)rr型調整:

由於在a的右孩子(r)的右子樹(r)上插入新結點,使原來平衡二叉樹變得不平衡,此時a的平衡因子由-1變為-2。圖3是rr型的最簡單形式。顯然,按照大小關係,結點b應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡,a結點就好像是繞結點b逆時針旋轉一樣。

圖3  最簡單的rr型調整

rr型調整的一般形式如下圖4所示,表示在a的右孩子b的右子樹br(不一定為空)中插入結點(圖中陰影部分所示)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將a的右孩子b提公升為新的根結點;②將原來的根結點a降為b的左孩子;③各子樹按大小關係連線(al和br不變,bl調整為a的右子樹)。

圖4  一般形式的rr型調整

(3)lr型調整:

由於在a的左孩子(l)的右子樹(r)上插入新結點,使原來平衡二叉樹變得不平衡,此時a的平衡因子由1變為2。圖5是lr型的最簡單形式。顯然,按照大小關係,結點c應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡。

圖5  最簡單的lr型調整

lr型調整的一般形式如下圖6所示,表示在a的左孩子b的右子樹(根結點為c,不一定為空)中插入結點(圖中兩個陰影部分之一)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將c的右孩子b提公升為新的根結點;②將原來的根結點a降為c的右孩子;③各子樹按大小關係連線(bl和ar不變,c

l和cr分別

調整為b的右子樹和a的左子樹)。

圖6  一般形式的lr型調整

(4)rl型調整:

由於在a的右孩子(r)的左子樹(l)上插入新結點,使原來平衡二叉樹變得不平衡,此時a的平衡因子由-1變為-2。圖7是rl型的最簡單形式。顯然,按照大小關係,結點c應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡。

圖7  最簡單的rl型調整

rl型調整的一般形式如下圖8所示,表示在a的右孩子b的左子樹(根結點為c,不一定為空)中插入結點(圖中兩個陰影部分之一)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將c的右孩子b提公升為新的根結點;②將原來的根結點a降為c的左孩子;③各子樹按大小關係連線(al和br不變,c

l和cr分別

調整為a的右子樹和b的左子樹)。

圖8  一般形式的rl型調整

平衡二叉樹的深度接近log2n的數量級,從而保證在二叉排序樹上插入、刪除和查詢等操作的平均時間複雜度為o(log2n)。

平衡二叉樹的實現原理

平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度盡可能小。平衡二叉樹定義 平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質 左右子樹深度之差的絕對值不大於1。左右子樹都是平衡二叉樹。平衡因子的概念 結點的平衡因子 結點的左子樹深度 結點的右子樹深度。若...

python實現平衡二叉樹 平衡二叉樹python

stack depth is initialised to 0 def find in tree node,find condition,stack depth assert stack depth max stack depth deeper than max depth stack depth ...

平衡二叉樹例題 平衡二叉樹

acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...