数据结构系列之平衡树(DSW法构建)
2015-06-13 15:51
501 查看
1、DSW原理:
DSW法构造平衡树主要分为两步,第一步是将一个二叉排序树通过旋转变为一个只含右节点的类似单链表的树;第二步是通过旋转将第一步中的树转化为平衡树。
2、实现
2.1 实现第一步
<span style="font-size:18px;"> public void creatBackbone(IntBSTNode p,boolean b){
IntBSTNode q=p;</span>
this.rightRotate(p,true); p=root; }
其中的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>
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>
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统