实验二 树
实验二 树-1-实现二叉树
参考教材p375,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
实验步骤
第一教材中给出了LinkedBinaryTree和BTNode,LinkedBinaryTree中的方法要在BTNode的基础上才能成功。
getright与getleft编写可以相互参考;
contains方法调用了find方法然后返回布尔值;
实验二 树-2-中序先序序列构造二叉树
基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如教材P372,给出HDIBEMJNAFCKGL和ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
实验步骤
该实验根据网上代码修改的,原代码:http://blog.csdn.net/huangcan0532/article/details/46776749
为实现测试字母形式,将int相关的定义改为string类型的进行实现。
找到根节点再中序遍历里的位置
中序遍历中,根节点左侧为左子树节点,右侧为右子树节点
左子树先序中序遍历,然后右子树也如此
最终进行递归操作
实验二 树-3-决策树
完成PP16.6
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
实验步骤
这个实验几乎就是课本原代码,可以说只需要做一下简单的课本代码修改就可以实现了。
实验二 树-4-表达式树
完成PP16.8
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
实验步骤
总而言之,该实验就是利用后序遍历得到表达式树所要求的算式的后缀表达,然后对于这个后缀表达式,我们就可以利用上学期完成的MyDC类进行计算就好了。
MyDC类我没有导入该实验的文档中,仍然在上学期的码云里,故实验实现图只放了实现后缀表达式那一步
实验二 树-5-二叉查找树
完成PP17.1
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
实验步骤
关于这个实验首先要补全课本上二叉查找树的代码,主要式findmin和findmax的方法,根据对春旺同学的询问,他告诉我了一个看起来很简单的方法。
public T findMax() {
while (root.getRight()!=null){
root = root.getRight();
}
return getRootElement();
}
public T findMin() {
while (root.getLeft()!=null){
root = root.getLeft();
}
return getRootElement();
}
findmax根据二叉树的性质,数字大于父节点的都在右边,因此一直getright就可以了,同理findmin也是如此
实验二 树-6-红黑树分析
参考http://www.cnblogs.com/rocedu/p/7483915.html对Java中的红黑树(TreeMap,HashMap)进行源码分析,并在实验报告中体现分析结果
实验步骤
红黑树(英语:Red–blacktree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是平衡二叉查找树的一种。平衡树在插入和删除的时候,会通过旋转操作将高度保持在logN。其中两款具有代表性的平衡树分别为AVL树和红黑树。AVL树由于实现比较复杂,而且插入和删除性能差,在实际环境下的应用不如红黑树。红黑树(Red-Black Tree,以下简称RBTree)的实际应用非常广泛,比如Linux内核中的完全公平调度器、高精度计时器、ext3文件系统等等,各种语言的函数库如Java的TreeMap和TreeSet,C++ STL的map、multimap、multiset等。RBTree也是函数式语言中最常用的持久数据结构之一,在计算几何中也有重要作用。值得一提的是,Java 8中HashMap的实现也因为用RBTree取代链表,性能有所提升。
旋转又分为左旋和右旋。通常左旋操作用于将一个向右倾斜的红色链接旋转为向左链接。对比操作前后,可以看出,该操作实际上是将红线链接的两个节点中的一个较大的节点移动到根节点上。
根据网上资料来看
作为平衡二叉查找树的实现之一,红黑树是最简洁、简单的。红黑树引入颜色,通过颜色这个条件的使用来保持树的高度平衡。作为平衡二叉查找树,旋转是必不可少的操作。通过旋转降低树的高度,在红黑树里面还转换颜色。
红黑树里的插入和删除的操作难理解,但是操作之前红黑树是平衡的,颜色是符合定义的。在操作的时候需要向兄弟节点、父节点、侄子节点借调和互换颜色,要达到这个目的,就需要不断的进行旋转。所以红黑树的插入删除操作需要不停的旋转,一旦借调了别的节点,删除和插入的节点就会达到局部的平衡(局部符合红黑树的定义),但是被借调的节点就不会平衡了,这时就需要以被借调的节点为起点继续进行调整,直到整棵树都是平衡的。根据网上所说来看插入具体的分为3种情况,删除分为4种情况。
整个红黑树的查找,插入和删除的算法复杂度都是O(logN),原因就是整个红黑树的高度是logN,查找从根到叶,走过的路径是树的高度,删除和插入操作是从叶到根的,所以经过的路径都是logN。