20172313 2017-2018-2 《程序设计与数据结构》实验二报告

20172313 2017-2018-2 《程序设计与数据结构》实验一报告
课程:《程序设计与数据结构》
班级: 1723
姓名: 李楠
学号:20172330
实验教师:王志强
实验日期:2018年11月8日
必修/选修: 必修

1.实验内容

实验二-1-实现二叉树

参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)

用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息

课下把代码推送到代码托管平台

实验二 树-2-中序先序序列构造二叉树

基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树

用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息

课下把代码推送到代码托管平台

实验二 树-3-决策树

自己设计并实现一颗决策树

提交测试代码运行截图,要全屏,包含自己的学号信息

课下把代码推送到代码托管平台

实验二 树-4-表达式树

输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,则为0分)

提交测试代码运行截图,要全屏,包含自己的学号信息

课下把代码推送到代码托管平台

实验二 树-5-二叉查找树

完成PP11.3

提交测试代码运行截图,要全屏,包含自己的学号信息

课下把代码推送到代码托管平台

实验二 树-6-红黑树分析

参考http://www.cnblogs.com/rocedu/p/7483915.html对Java中的红黑树(TreeMap,HashMap)进行源码分析,并在实验报告中体现分析结果。
(C:\Program Files\Java\jdk-11.0.1\lib\src\java.base\java\util)

2. 实验过程及结果

实验1:

(https://gitee.com/CS-IMIS-23/linan20172330newterm/blob/master/src/week6/LinkedBinaryTreeTest.java)

实验2:

实验3:

实验4:

实验5:

实验6:

TreeMap类

①、红黑树的本质:
Ⅰ. 红黑树本质上是一个二叉查找树(BST),但是它从根到最远叶子的长度不会超过到最近叶子长度的两倍,因此是近似平衡的。
Ⅱ. 红黑树的节点不是黑的就是红的,不会有第三种颜色。
Ⅲ. 树根必须是黑色。
Ⅳ. 叶子所指的空节点必须是黑色。
Ⅴ. 如果某个节点是红色,那么它的两个儿子必须都是黑色。
Ⅵ. 从任意节点出发的所有向下的路径上包含相同个数的黑节点。这个个数我们称为黑高度Bh。
②、 TreeMap:从API文档中查到:基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。TreeMap的几个重要特点:
Ⅰ.TreeMap内部是使用红黑树结构存储的。
Ⅱ. 一个对象想要成为TreeMap中的key,那么该对象所属的类必须实现Comparable接口,否则抛异常,因为key的寻找是依赖于比较器的实现。
Ⅲ.TreeMap中允许null值作为value,但是不允许null成为key。

TreeMap中于红黑树相关的主要函数有:

红黑树的节点颜色--红色
private static final boolean RED = false; 
红黑树的节点颜色--黑色
private static final boolean BLACK = true;
红黑树的节点”对应的类。
static final class Entry<K,V> implements Map.Entry<K,V> { ... }

Entry包含了6个部分内容:key(键)、value(值)、left(左孩子)、right(右孩子)、parent(父节点)、color(颜色)
Entry节点根据key进行排序,Entry节点包含的内容为value。

private void rotateLeft(Entry<K,V> p) { ... }//左旋
private void rotateRight(Entry<K,V> p) { ... }//右旋
public V put(K key, V value) { ... }//插入操作
红黑树执行插入操作之后,要执行“插入修正操作”。
目的是:保红黑树在进行插入节点之后,仍然是一颗红黑树
private void fixAfterInsertion(Entry<K,V> x) { ... }//插入修正操作

private void deleteEntry(Entry<K,V> p) { ... }//删除操作
红黑树执行删除之后,要执行“删除修正操作”。
目的是保证:红黑树删除节点之后,仍然是一颗红黑树//删除修正操作
private void fixAfterDeletion(Entry<K,V> x) { ... }//删除修正操作

HashMap类

①.HashMap类的TreeNode结点

static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {
    TreeNode<K,V> parent;  // red-black tree links
    TreeNode<K,V> left;
    TreeNode<K,V> right;
    TreeNode<K,V> prev;    // needed to unlink next upon deletion
    boolean red;
}

其中包括红黑树节点,有父亲、左右孩子、前一个元素的节点,还有个颜色值。
②.另外由于它继承自 LinkedHashMap.Entry ,而 LinkedHashMap.Entry 继承自 HashMap.Node ,因此还有额外的 6 个属性:

//继承 LinkedHashMap.Entry 的
Entry<K,V> before, after;

//HashMap.Node 的
final int hash;
final K key;
V value;
Node<K,V> next;

HashMap 中有三个关于红黑树的关键参数:
TREEIFY_THRESHOLD
UNTREEIFY_THRESHOLD
MIN_TREEIFY_CAPACITY

//一个桶的树化阈值
//当桶中元素个数超过这个值时,需要使用红黑树节点替换链表节点
//这个值必须为 8,要不然频繁转换效率也不高
static final int TREEIFY_THRESHOLD = 8;

//一个树的链表还原阈值
//当扩容时,桶中元素个数小于这个值,就会把树形的桶元素 还原(切分)为链表结构
//这个值应该比上面那个小,至少为 6,避免频繁转换
static final int UNTREEIFY_THRESHOLD = 6;

//哈希表的最小树形化容量
//当哈希表中的容量大于这个值时,表中的桶才能进行树形化
//否则桶内元素太多时会扩容,而不是树形化
//为了避免进行扩容、树形化选择的冲突,这个值不能小于 4 * TREEIFY_THRESHOLD
static final int MIN_TREEIFY_CAPACITY = 64;

3.实验过程中遇到的问题

  • 1.当时在做的时候实验5输出时只进行了两步然后开始报错。

  • 1.实验1解决方案
    我发现在我输入数字的时候中间的空格是后加入的所以导致识别不了最终报错。

4.其他

这一次的实验都是关于链表,数组,队列的,有很多基础东西上课没有学会的这一次也得到了补充。

5.参考资料

《Java 密码学算法》

猜你喜欢

转载自www.cnblogs.com/linanlalala/p/9942602.html