用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