博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20162319莫礼钟 实验二 树
阅读量:5263 次
发布时间:2019-06-14

本文共 3092 字,大约阅读时间需要 10 分钟。

任务一:

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

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

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

任务一实现:

1063999-20171029232632945-911386807.png

  • 首先我们先把课本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或自己编写驱动类对自己实现的功能进行测试,提交测试代码运行截图,要全屏,包含自己的学号信息

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

任务二实现:

1063999-20171101074459545-476961076.png

任务三:

完成PP16.6

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

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

任务三实现:

  • 其实之前的课本代码上已经有一个检查病痛的代码,我们稍微改一下就行了

图片

任务四:

任务四实现:

任务五:

完成PP17.1

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

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

任务五实现:

1063999-20171029235057945-450381141.png

  • 我感觉实现查找树中最大值最小值最难的地方还是在于返回值。我是在结对伙伴刘伟康的帮助下完成的。首先我们要获取的元素(拿最小值举例),思考一下,树中的最小值在哪?——在叶结点。查找树的最小值在哪?——左子树的叶结点。那我们怎么获取左子树叶结点的元素呢?——中序遍历第一个访问的元素是哪?——左子树的叶结点。那我们就得出来结论了。那么我们返回哪里呢?——返回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;//强制将根节点转成黑色

    } ```

转载于:https://www.cnblogs.com/Mosemonkey/p/7751873.html

你可能感兴趣的文章
linux sed命令
查看>>
html标签的嵌套规则
查看>>
[Source] Machine Learning Gathering/Surveys
查看>>
HTML <select> 标签
查看>>
类加载机制
查看>>
tju 1782. The jackpot
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
bzoj3224 splay板子
查看>>
程序存储问题
查看>>
Mac版OBS设置详解
查看>>
优雅地书写回调——Promise
查看>>
android主流开源库
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
Ubuntu下面安装eclipse for c++
查看>>