1、DSW原理:
DSW法构造平衡树主要分为两步,第一步是将一个二叉排序树通过旋转变为一个只含右节点的类似单链表的树;第二步是通过旋转将第一步中的树转化为平衡树。
2、实现
2.1 实现第一步
<span style="font-size:18px;"> public void creatBackbone(IntBSTNode p,boolean b){
IntBSTNode q=p;</span>
<span style="font-size:18px;"></span><pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"> //将所有左子树旋转使二叉排序树不含左子树</span></span>
while(p.left!=null){this.rightRotate(p,true); p=root; }
<span style="font-size:18px;"> // 遍历右子树,完成右子树中的左子树的旋转操作
while(p.right!=null){
q=p.right;
while(q!=null){
if(q.left!=null){
IntBSTNode s=q.left;
this.rightRotate(q, false);
p.right=s;
q=s.left;
}
else
break;
}
p=p.right;
q=p.right;
}
}</span>
其中的rightRotate函数如下:
<span style="font-size:18px;"> public void rightRotate(IntBSTNode p,boolean b){ //右旋转
IntBSTNode left=p.left;
IntBSTNode rightchild=left.right;
p.left=rightchild;
left.right=p;
if(b)
root=left;
}</span>
2.2 实现第二步
(暂时还不会,等待更新。。。)
3、测试3.1、对第一步的测试
<span style="font-size:18px;">package 二叉树;
import 元素排序算法.Sort;
public class Test {
public static void main(String[] args) {
IntBST i=new IntBST();
Sort s=new Sort();
i.insert(2);
i.insert(0);
i.insert(7);
i.insert(-12);
i.insert(1);
i.insert(4);
i.insert(8);
System.out.println("普通二叉排序树的广度优先遍历:");
i.breadthFirst();
System.out.println();
i.creatBackbone(i.root,true);
System.out.println("调用creatBackbone后的广度优先遍历:");
i.breadthFirst();
}
}</span>
4、结果:
<span style="font-size:18px;">普通二叉排序树的广度优先遍历:
2 0 7 -12 1 4 8
调用creatBackbone后的广度优先遍历:
-12 0 1 2 4 7 8 </span>