任务一:
参考教材p375,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder)
用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
任务一实现:
- 首先我们先把课本P375的代码给敲了,然后我们实现getRight,contains,toString,preorder,postorder这几个方法。
getRight方法,参考getLeft方法即可``` public LinkedBinaryTree getLeft() {
if (root == null) throw new EmptyCollectionException("Get left operation " + "failed. The tree is empty.");LinkedBinaryTree
result = new LinkedBinaryTree<>(); result.root = root.getLeft(); return result;} - contains方法,这个方法的意思是查找树中有没有需要的元素,所以我们加一个if函数并且提取当前的元素,如果为空返回false,不为空返回true
- toString参考数组方法
preorder和postoder分别是前序和后序遍历,我们先看一下BTNode这个代码里,它已经提前写好了inorder(中序遍历)所以我们参考一下,但是我们需要把顺序改一下。比如说前序遍历需要先访问根,后序遍历要最后访问根。
任务二:
基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如教材P372,给出HDIBEMJNAFCKGL和ABDHIEJMNCFGKL,构造出附图中的树
用JUnit或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
任务二实现:
任务三:
完成PP16.6
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
任务三实现:
- 其实之前的课本代码上已经有一个检查病痛的代码,我们稍微改一下就行了
图片
任务四:
任务四实现:
任务五:
完成PP17.1
提交测试代码运行截图,要全屏,包含自己的学号信息
课下把代码推送到代码托管平台
任务五实现:
- 我感觉实现查找树中最大值最小值最难的地方还是在于返回值。我是在结对伙伴刘伟康的帮助下完成的。首先我们要获取的元素(拿最小值举例),思考一下,树中的最小值在哪?——在叶结点。查找树的最小值在哪?——左子树的叶结点。那我们怎么获取左子树叶结点的元素呢?——中序遍历第一个访问的元素是哪?——左子树的叶结点。那我们就得出来结论了。那么我们返回哪里呢?——返回0,因为是第一个元素并且从0开始数数。
- 最大值类比最小值。
任务六:
参考http://www.cnblogs.com/rocedu/p/7483915.html对Java中的红黑树(TreeMap,HashMap)进行源码分析,并在实验报告中体现分析结果
任务六现实:
- 红黑树规则:
- 1.每个节点要么是红色、要么是黑色
- 2.根节点一定是黑色
- 3.红色节点不可以连续出现(父节点、子节点不可同时为红)
4.从任意节点出发,到树底的所有路线,途径的黑节点数量必须相同在修改红黑树的时候,切记要维护这个规则。一般默认插入红色节点(除非是root节点),插入后再进行旋转和颜色变换
``` private void fixAfterInsertion(Entry<K,V> x) { x.color = RED;while (x != null && x != root && x.parent.color == RED) {//父节点是红色 if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {//父节点是曾节点的左节点 Entry<K,V> y = rightOf(parentOf(parentOf(x))); if (colorOf(y) == RED) {//父、叔节点都是红色,情况4 //将父节点和叔节点变为黑色,曾节点变为红色 setColor(parentOf(x), BLACK); setColor(y, BLACK); setColor(parentOf(parentOf(x)), RED); x = parentOf(parentOf(x)); } else {//父节点是红色,叔节点是黑色或者null if (x == rightOf(parentOf(x))) {//内侧子孙 x = parentOf(x); rotateLeft(x);//旋转成外侧子孙 } setColor(parentOf(x), BLACK); setColor(parentOf(parentOf(x)), RED); rotateRight(parentOf(parentOf(x)));//旋转曾节点 } } else {//父节点是曾节点的右节点 Entry<K,V> y = leftOf(parentOf(parentOf(x))); if (colorOf(y) == RED) { setColor(parentOf(x), BLACK); setColor(y, BLACK); setColor(parentOf(parentOf(x)), RED); x = parentOf(parentOf(x)); } else { if (x == leftOf(parentOf(x))) { x = parentOf(x); rotateRight(x); } setColor(parentOf(x), BLACK); setColor(parentOf(parentOf(x)), RED); rotateLeft(parentOf(parentOf(x))); } } } root.color = BLACK;//强制将根节点转成黑色
} ```