任务一:

参考教材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;//强制将根节点转成黑色
} ```
posted on 2017-10-29 23:17  20162319莫礼钟  阅读(202)  评论(0编辑  收藏  举报