二叉查詢樹(二叉搜尋樹)的構造是為了加快查詢的效率,其查詢的思想類似於折半查詢法。而搜尋樹節點不同的插入次序會導致不同的查詢效率。也就是擁有相同的資料內容,由於樹的插入次序的不同導致了不同的樹的深度與平均查詢長度。
比如有8個資料分別是1,2,3,4,5,6,7,8,如果按照由小到的的順序依次插入,構造的樹是這樣的。
這棵樹有8個節點,根節點的高度為7,平均查詢長度為(1+2+3+4+5+6+7+8)/8 = 4.5。
實際上,以這種插入方式構造的樹與鍊錶的結構也沒什麼差別了,很顯然這並不是我們想要的結果,於是就有了平衡二叉樹。
平衡二叉樹(balanced binary tree)的定義是這樣的——空樹,或者任一節點左、右子樹高度差的絕對值不超過1,稱為平衡二叉樹。
比如,我們將1,2,3,4,5,6,7,8這幾個節點以5,3,1,4,2,7,6,8的順序插入構造查詢二叉樹,這棵樹就是乙個平衡二叉樹,它的根節點高度為3,平均查詢長度為(1*1+ 2*2 + 4*3 + 1*4)/8 = 2.625,,並且它的任一節點左、右子樹高度差的絕對值不超過1。
而如果按照6,4,3,5,2,1,7,8的順序插入構造查詢二叉樹,這棵樹也不能稱為平衡二叉樹,因為它的根節點的左子樹高度為4,而右子樹的高度為2,相差大於1;而對於4這乙個節點,它的左子樹高度為3,右子樹的高度為1,相差也大於1。而這棵樹的平均查詢長度為(1*1 + 2*2 + 3*3 + 4*1 + 5*1)/ 8 = 2.875(這裡資料量較小,看不出與平衡二叉樹的明顯差別)。
一棵樹為平衡二叉樹,此時插入乙個節點可能會導致這棵樹的不平衡,比如下面這棵樹,原為一棵平衡二叉樹,在插入9這個節點後,根節點的左子樹深度為1,右子樹深度為3,兩邊深度差別的絕對值大於1,所以在插入9這個節點後,不再是一棵平衡二叉樹。
上面這張圖所示的內容中,受到影響的是5這乙個根節點,我們稱這乙個節點為「發現者」,而9這乙個節點稱為「麻煩節點」,「麻煩節點」在「發現者」的右邊,因此叫做rr插入;而要保持這棵樹繼續為一棵平衡二叉樹,需要做rr旋轉,也就是右單旋,它是乙個順時針的旋轉,如下圖所示。
左單旋(ll旋轉)與右單旋是類似的,「麻煩節點」在「發現者」的左邊,因此需要左單旋,如下圖所示。
如果「麻煩節點」的插入是在「發現者」的左子樹的右子樹,需要進行lr旋轉,這乙個旋轉需要調整的關注點是在「發現者」與「發現者」的左子樹,以及這乙個左子樹的右子樹節點,如下圖所示。
與lr旋轉類似,如果「麻煩節點」的插入是在「發現者」的右子樹的左子樹,則需要進行rl旋轉,這一旋轉需要調整的關注點是在「發現者」與「發現者」的右子樹,以及這乙個右子樹的左子樹,如下圖所示。
值得注意的是,在調整二叉樹時,被破壞平衡的節點與破壞平衡的節點很可能與根節點無關,我們只需要找出「不平衡」的這部分的節點,以旋轉的方式加以調整即可保證整個二叉樹的平衡。
二叉樹 平衡二叉樹
1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...
平衡二叉樹例題 平衡二叉樹
acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...
二叉樹13 平衡二叉樹
題目 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。思路 所謂平衡二叉樹是指空樹或者任意結點的2棵子樹的高度差不差過1的樹。要判斷以root為根的樹是否是一棵平衡二叉樹,需要先判斷以root.left為根的子樹和以root.right為根的子樹是否是平衡二叉樹,如果有某一棵子樹不是平衡二叉樹那麼整棵...