现在的位置: 首页 > 综合 > 正文

用DSW算法一次性平衡二叉查找树

2019年04月10日 ⁄ 综合 ⁄ 共 6545字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.