旋轉是很多二叉平衡樹維持平衡的主要手段,在這裡複習一下。其實旋轉過程中節點位置的變化只要遵循乙個原則就行了:比root小的在左子樹,比root大的在右子樹。(當然這裡前提條件是左小右大)。
情況一:插入f節點導致失衡:
這裡失衡的是a的左右子樹,很容易就可以想到旋轉b-a鏈,值得注意的是e節點,它原先在b的右子樹,現在也依然在b的右子樹,它原先在a的左子樹,現在也依然在a的左子樹。
若插入f節點在d的右子樹處,旋轉操作依然是上圖那樣,不談。
但如果插入f節點是e的孩子就不一樣了。
情況二:插入f節點導致失衡:
插入節點是e的孩子時,如果我們還像上面那樣旋轉b-a鏈,旋轉後的樹依然是不平衡的。事實上,這樣的旋轉使得b成為了新的根節點,而原圖中比b大的節點有4個,比b小的節點只有d,若b為根其左子樹只能為d,必定是不平衡的。
我們仔細觀察原圖,這裡e節點是很特殊的節點。首先它是實際執行了插入操作的節點,其次圖中比e小的節點有b、d、f,比e大的節點有a、c。如果能夠讓e節點做新的根節點就很好平衡了,那麼怎樣讓e節點「上位」呢?
方法是進行兩次旋轉,如下圖:
e節點恐成最大贏家……
插入節點是e的右子樹的情況與之類似,這裡給出旋轉圖:
f比e大,雙旋之後還是在e的右節點。
雙旋看圖理解起來簡單,實際實現時要注意,我們可以判斷失衡的是a節點,由a有直接關係的是b和c,那麼我們怎麼知道新插入的f節點是d的子樹還是e的子樹呢?這裡的方法是比較f節點值與b的大小,大則是e的子樹,要左-右共兩次旋轉,小則是d的子樹,要一次右旋轉。
當然還要考慮映象情況:
情況三:插入 f導致失衡:
進行一次左旋,關注d節點,它比c小,旋轉後依然在c的左子樹。
情況四:插入f導致失衡:
這時候左旋失敗,理由和之前右旋失敗類似,比c節點大的節點只有乙個e,c是沒法做新的根節點的。這裡特殊的是d節點。
進行右-左兩次雙旋就可以了。d節點:爽到……
插入節點是d的右子樹情況類似,rt:
平衡二叉樹的旋轉操作
平衡二叉樹的定義 任意的左右子樹高度差的絕對值不超過1,將這樣的二叉樹稱為平衡二叉樹,二叉平衡樹前提是乙個二叉排序樹。1 ll 插入乙個新節點到根節點的左子樹 left 的左子樹 left 導致根節點的平衡因子由1變為2 2 rr 插入乙個新節點到根節點的右子樹 right 的右子樹 right 導...
平衡二叉樹(樹的旋轉)
平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度盡可能小,因此,樹中每個結點的兩棵子樹的深度不要偏差太大。平衡二叉樹的遞迴定義 平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質 左右子樹深度之差的絕對值不大於1。左右子樹都是平衡二叉樹。平衡因子的概念 ...
平衡二叉樹(樹的旋轉)
平衡二叉樹建立在二叉排序樹的基礎上,目的是使二叉排序樹的平均查詢長度更小,即讓各結點的深度盡可能小,因此,樹中每個結點的兩棵子樹的深度不要偏差太大。平衡二叉樹的遞迴定義 平衡二叉樹是一棵二叉樹,其可以為空,或滿足如下2個性質 左右子樹深度之差的絕對值不大於1。左右子樹都是平衡二叉樹。平衡因子的概念 ...