任务一:
参考教材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<T> 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
- 红黑树规则:
- 1.每个节点要么是红色、要么是黑色
- 2.根节点一定是黑色
- 3.红色节点不可以连续出现(父节点、子节点不可同时为红)
- 4.从任意节点出发,到树底的所有路线,途径的黑节点数量必须相同在修改红黑树的时候,切记要维护这个规则。一般默认插入红色节点(除非是root节点),插入后再进行旋转和颜色变换
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;//强制将根节点转成黑色
} ```