平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度盡可能小。
平衡二叉樹定義:平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質:①左右子樹深度之差的絕對值不大於1。②左右子樹都是平衡二叉樹。
平衡因子的概念:結點的平衡因子 = 結點的左子樹深度 — 結點的右子樹深度。若平衡因子的取值為-1、0或1時,該節點是平衡的,否則是不平衡的。
實現過程是通過在一棵平衡二叉樹中依次插入元素(按照二叉排序樹的方式),若出現不平衡,
則要根據新插入的結點與最低不平衡結點的位置關係進行相應的調整。分為ll型、rr型、lr型和rl型4種型別。
由於在a的左孩子(l)的左子樹(l)上插入新結點,使原來平衡二叉樹變得不平衡,此時a的平衡因子由1增至2。
按照大小關係,結點b應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡,a結點就好像是繞結點b順時針旋轉一樣。
ll型調整的一般形式如下所示,表示在a的左孩子b的左子樹bl中插入結點(圖中陰影部分所示)而導致不平衡( h 表示子樹的深度)。這種情況調整如下:①將a的左孩子b提公升為新的根結點;②將原來的根結點a降為b的右孩子;③各子樹按大小關係連線(bl和ar不變,br調整為a的左子樹)。
由於在a的右孩子(r)的右子樹(r)上插入新結點,使原來平衡二叉樹變得不平衡,此時a的平衡因子由1變為2。
按照大小關係,結點b應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡,a結點就好像是繞結點b逆時針旋轉一樣。
rr型調整的一般形式如下圖4所示,表示在a的右孩子b的右子樹br中插入結點(陰影部分所示)而導致不平衡。這種情況調整如下:①將a的右孩子b提公升為新的根結點;②將原來的根結點a降為b的左孩子;③各子樹按大小關係連線(al和br不變,bl調整為a的右子樹)。
由於在a的左孩子(l)的右子樹(r)上插入新結點,使原來平衡二叉樹變得不平衡,此時a的平衡因子由1變為2。
按照大小關係,結點c應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡,此時需要進行2次旋轉。
lr型調整的一般形式如下,表示在a的左孩子b的右子樹中插入結點而導致不平衡。
這種情況調整如下:①將b的右孩子c提公升為新的根結點;②將原來的根結點a降為c的右孩子;③各子樹按大小關係連線(bl和ar不變,cl和cr分別調整為b的右子樹和a的左子樹)。
由於在a的右孩子(r)的左子樹(l)上插入新結點,使原來平衡二叉樹變得不平衡,此時a的平衡因子由1變為2。
按照大小關係,結點c應作為新的根結點,其餘兩個節點分別作為左右孩子節點才能平衡
rl型調整的一般形式如下,表示在a的右孩子b的左子樹中插入結點而導致不平衡。
這種情況調整如下:①將b的左孩子c提公升為新的根結點;②將原來的根結點a降為c的左孩子;③各子樹按大小關係連線(al和br不變,cl和cr分別調整為a的右子樹和b的左子樹)。
平衡二叉樹的實現原理
1.概念 平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度盡可能小,因此,樹中每個結點的兩棵子樹的深度不要偏差太大。平衡二叉樹的遞迴定義 平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下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兩種狀態,省...