1. 程式人生 > >用DSW演算法一次性平衡二叉查詢樹

用DSW演算法一次性平衡二叉查詢樹

參考原文(原文作者:Timothy J. Rolfe ):http://penguin.ewu.edu/~trolfe/DSWpaper/

DSW演算法用於平衡BST(二叉查詢樹),而且平衡後的二叉樹是一顆完全二叉樹(complete binary tree-即葉子節點頂多位於最後兩層,而且從左到右排列)。該演算法的優點是:無須開闢額外的空間用於儲存節點,時間複雜度線性O(n)。該演算法分兩個階段進行:首先將任意一顆二叉樹通過一序列右旋轉(right rotations)轉換成一個單鏈結構(稱作vine,即每個非葉子節點只有右孩子,沒有左孩子);然後在第二階段中對單鏈結構通過幾個批次左旋轉(left rotations)生成一顆完全二叉樹。為了生成完全二叉樹,在第二階段的左旋轉中,首先只將一部分節點左旋轉(這算是第一個批次左旋轉),然後依次對剩下的單鏈節點做多批次左旋轉(每個批次的左旋轉所針對的節點位於剩下的vine上依次相隔的一個節點),直到某個批次的左旋轉次數不大於1。

實現程式碼:

測試

Test case 1:

Before being balanced, in-order BST:
 2 10 12 13 20 25 29 30 31 32 33 35
After being balanced, in-order BST:
 2 10 12 13 20 25 29 30 31 32 33 35


After being balanced, it is now a complete BST:
[expected max level: 3; real max level: 3]
                   30             
        13                 33     
  10        25       32      35 
 2  12  20  29  31           
************************************
Test case 2:

Before being balanced, in-order BST:
 5 10 15 20 23 25 28 30 40
After being balanced, in-order BST:
 5 10 15 20 23 25 28 30 40


After being balanced, it is now a complete BST:
[expected max level: 3; real max level: 3]
                  25             
        20              30     
   10      23      28      40 
 5  15