参考原文(原文作者: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