课程:《程序设计与数据结构》
班级: 1723
姓名: 胡智韬
学号:20172315
实验教师:王志强
实验日期:2018年11月2日
必修/选修: 必修php
参考教材p212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)html
用JUnit或本身编写驱动类对本身实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含本身的学号信息java
课下把代码推送到代码托管平台web
基于LinkedBinaryTree,实现基于(中序,先序)序列构造惟一一棵二㕚树的功能,好比给出中序HDIBEMJNAFCKGL和后序ABDHIEJMNCFGKL,构造出附图中的树数组
用JUnit或本身编写驱动类对本身实现的功能进行测试,提交测试代码运行截图,要全屏,包含本身的学号信息数据结构
课下把代码推送到代码托管平台
app
本身设计并实现一颗决策树函数
提交测试代码运行截图,要全屏,包含本身的学号信息源码分析
课下把代码推送到代码托管平台post
输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(若是没有用树,则为0分)
提交测试代码运行截图,要全屏,包含本身的学号信息
课下把代码推送到代码托管平台
完成PP11.3
提交测试代码运行截图,要全屏,包含本身的学号信息
课下把代码推送到代码托管平台
参考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)
课下把代码推送到代码托管平台
Entry是HashMap中的一个静态内部类。代码以下
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next;//存储指向下一个Entry的引用,单链表结构 int hash;//对key的hashcode值进行hash运算后获得的值,存储在Entry,避免重复计算 /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; }
简单来讲,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,若是定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操做很快,仅需一次寻址便可;若是定位到的数组包含链表,对于添加操做,其时间复杂度为O(n),首先遍历链表,存在即覆盖,不然新增;对于查找操做来说,仍需遍历链表,而后经过key对象的equals方法逐一比对查找。因此,性能考虑,HashMap中的链表出现越少,性能才会越好。
public HashMap(int initialCapacity, float loadFactor) { //此处对传入的初始容量进行校验,最大不能超过MAXIMUM_CAPACITY = 1<<30(230) if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; threshold = initialCapacity; init();//init方法在HashMap中没有实际实现,不过在其子类如 linkedHashMap中就会有对应实现 }
从上面这段代码咱们能够看出,在常规构造器中,没有为数组table分配内存空间(有一个入参为指定Map的构造器例外),而是在执行put操做的时候才真正构建table数组
在详细介绍TreeMap的代码以前,咱们先创建一个总体概念。
TreeMap是经过红黑树实现的,TreeMap存储的是key-value键值对,TreeMap的排序是基于对key的排序。
TreeMap提供了操做“key”、“key-value”、“value”等方法,也提供了对TreeMap这颗树进行总体操做的方法,如获取子树、反向树。
1 默认构造函数
public TreeMap() { comparator = null; }
2 带比较器的构造函数
public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; }
3 带Map的构造函数,Map会成为TreeMap的子集
public TreeMap(Map<? extends K, ? extends V> m) { comparator = null; putAll(m); }
该构造函数会调用putAll()将m中的全部元素添加到TreeMap中。putAll()源码以下:
public void putAll(Map<? extends K, ? extends V> m) { for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) put(e.getKey(), e.getValue()); }
从中,咱们能够看出putAll()就是将m中的key-value逐个的添加到TreeMap中。
4 带SortedMap的构造函数,SortedMap会成为TreeMap的子集
public TreeMap(SortedMap<K, ? extends V> m) { comparator = m.comparator(); try { buildFromSorted(m.size(), m.entrySet().iterator(), null, null); } catch (java.io.IOException cannotHappen) { } catch (ClassNotFoundException cannotHappen) { } }
该构造函数不一样于上一个构造函数,在上一个构造函数中传入的参数是Map,Map不是有序的,因此要逐个添加。
而该构造函数的参数是SortedMap是一个有序的Map,咱们经过buildFromSorted()来建立对应的Map。
问题1:在作实验4时不知道该如何写
问题1解决方案:能够利用二叉树求得后缀表达式,首先利用中缀表达式构造二叉树,数字是叶子节点,操做符为根节点。每次找到“最后计算”的运算符,做为当前根节点,运算符左侧表达式做为左节点,右侧表达式做为右节点,而后递归处理(http://www.xuebuyuan.com/388108.html)。9+(3-1)*3+10/2对应的二叉树的构造过程以下图所示:
此二叉树作后序遍历就获得了后缀表达式。