zoukankan      html  css  js  c++  java
  • 20162319莫礼钟 实验二 树

    任务一:

    参考教材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 &amp;&amp; x != root &amp;&amp; x.parent.color == RED) {//父节点是红色
                if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {//父节点是曾节点的左节点
                    Entry&lt;K,V&gt; 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&lt;K,V&gt; 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;//强制将根节点转成黑色
    } ```
  • 相关阅读:
    Web.xml中Filter过滤器标签几个说明
    JVM参数配置大全
    Java时间日期格式转换
    第一天用博客园
    Java基础--序列化和反序列化
    Java面试题2017
    固定布局,流动布局,弹性布局
    viewport
    索引
    Java虚拟机
  • 原文地址:https://www.cnblogs.com/Mosemonkey/p/7751873.html
Copyright © 2011-2022 走看看