代码改变世界

20182327 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结

2019-11-19 20:48  BBIowa  阅读(135)  评论(1编辑  收藏  举报

20182327 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结

教材学习内容总结

  • 1、 树的遍历:

(1)先序遍历:先访问根,再访问左右子树。

(2)中序便利:先遍历左子树,再访问根节点,再访问右子树。

(3)后序遍历:先便利左子树,再遍历右子树,最后遍历根节点。

  • 2、树的实现:

(1)数组实现:将数据放置于数组中,用数组下标定义数据的先后,用数组将树的理想构图逻辑化。比如:根节点存放于下标为n的位置,左子树在(2n+1)的位置,右子树在(2*(n+1))的位置。缺点是对空间略有浪费。

(2)链表实现:建立一个节点链表,将每个节点设立左节点和右节点,在构造树时,声明左子树,右子树的节点进行连接。要找某个节点时,也可以用a.next来寻找,以a.next!=null来作为循环结束的的条件。

  • 3、
  • 决策树:决策树构造方法很简单,只需存入你想输出的字符串,在树类构造方法里多设置几个构造方法来设置,通过调用不同的构造方法来实现节点的定义,左子树或右子树的建立,左右子树都有的建立。但作用极大,在以后的app建设中必然会用到决策树来寻找最适合的答案。
  • 二叉查找树:即用循环寻找要找的元素,原理简单,注意:二叉树有一共同特点,即先确定左子树,再确定右函数。
  • 二叉树删除:删除要分三种情况

(1)删除叶子结点:直接找到到删除的节点的父节点,使父节点的相应左右子树等于null。
用子节点代替他。

(2)删除含一个子结点的结点(左或右):直接用子节点代替他。

(3)删除含左右两个结点的结点:先将树中序遍历,取待删除结点前面的一个元素,再在树中寻找这个结点。将这个结点删除,再将待删结点的值改为先前找到的值

教材学习中的问题和解决过程

  • 问题1:删除含左右两个结点的结点
  • 解答:
    先将树中序遍历,取待删除结点前面的一个元素,再在树中寻找这个结点。将这个结点删除,再将待删结点的值改为先前找到的值

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic{

//key这个成员变量的类型为T,T的类型由外部指定

private T key;

public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定
    this.key = key;
}

public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
    return key;
}

}
//泛型的类型参数只能是类类型(包括自定义类),不能是简单类型
//传入的实参类型需与泛型的类型参数类型相同,即为Integer.

Generic<Integer> genericInteger = new Generic<Integer>(123456);

//传入的实参类型需与泛型的类型参数类型相同,即为String.

Generic<String> genericString = new Generic<String>("key_vlaue");
Log.d("泛型测试","key is " + genericInteger.getKey());
Log.d("泛型测试","key is " + genericString.getKey());  
  • 问题2:(!(element instanceof Comparable))

  • 问题2解决方案:
    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。用法:result = object instanceof class参数:Result:布尔类型。Object:必选项。任意对象表达式。Class:必选项。任意已定义的对象类。说明:如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false

       interface A{}
    

    class B implements A{

    }
    class C extends B {

    }

    class instanceoftest {
    public static void main(String[] args){
    A a=null;
    B b=null;
    boolean res;

          System.out.println("instanceoftest test case 1: ------------------");
          res = a instanceof A;
          System.out.println("a instanceof A: " + res);
    
          res = b instanceof B;
          System.out.println("b instanceof B: " + res);
    
          System.out.println("/ninstanceoftest test case 2: ------------------");
          a=new B();
          b=new B();
    
          res = a instanceof A;
          System.out.println("a instanceof A: " + res);
    
          res = a instanceof B;
          System.out.println("a instanceof B: " + res);
    
          res = b instanceof A;
          System.out.println("b instanceof A: " + res);
    
          res = b instanceof B;
          System.out.println("b instanceof B: " + res);
    
          System.out.println("/ninstanceoftest test case 3: ------------------");
          B b2=(C)new C();
    
          res = b2 instanceof A;
          System.out.println("b2 instanceof A: " + res);
    
          res = b2 instanceof B;
          System.out.println("b2 instanceof B: " + res);
    
          res = b2 instanceof C;
          System.out.println("b2 instanceof C: " + res);
      }
    

    }

代码调试中的问题和解决过程

  • 问题一:为了比较两个对象的大小,时常需要在类的头部声明“T extends Comparable”,那么代码泛型中T继承的Comparable到底是整个方法是Comparable类型还是其中的变量是Comparable类型。

  • 问题一解决方法:

    import java.util.*;
    class Demo<T extends List>{}
     public class Test
    

    {
    public static void main(String[] args) {
    Demo p = null; // 编译正确
    //这里因为ArrayList是List的子类所以通过
    //如果改为Demo p = null;就会报错这样就限制了上限
    }
    }
    Calendar为GregorianCalendar 的父类并且GregorianCalendar 实现了Comparable>。

  • 问题2:如何解决空间不足的问题

  • 问题2解决方案:可以直接引用ArrayList中的expandCapacity()

private void expandCapacity() {

        T[] larger = (T[]) (new Object[tree.length * 2]);

        for (int index = 0; index < tree.length; index++)

            larger[index] = tree[index];

        tree = larger;

    }

代码托管

(statistics.sh脚本的运行结果截图)

上周考试错题总结

  • 1.It is possible to implement a stack and a queue in such a way that all operations take a constant amount of time.
    A .true
    B .false
    正确答案: A 我的答案: B
    解析: 理想情况。

  • 2.In a circular array-based implementation of a queue, the elements must all be shifted when the dequeue operation is called.
    A .true
    B .false
    正确答案: B 你的答案: A
    解析:基于循环数组的队列实现无需移动元素。

  • 3.A stack is a ___________________ data structure.
    A.LIFO
    B.FIFO
    C.link based
    D.array based
    E.none of the above
    解析:堆栈是后进先出的数据结构。这意味着放在堆栈上的最后一个元素将是被删除的第一个元素。

  • 4.A queue is a ____________________ data structure.
    A.LIFO
    B.FIFO
    C.link based
    D.array based
    E.none of the above
    解析:队列是FIFO(先进先出)数据结构,这意味着放入队列的第一个元素是从队列中删除的第一个元素。

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  6. 其他加分:

    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:

    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评模板:

  • 博客中值得学习的或问题:

    • 同学们已经有意识的遇见错误就截图,给后面写博客的各种方便很多,我一直忘记只能重新敲一遍。
  • 代码中值得学习的或问题:

    • 条条大路通罗马,好多同学可以曲线思维弄出代码,听他们讲解后真的很佩服。
  • 基于评分标准,我给本博客打分:11分。得分情况如下:正确使用Markdown语法+1.教材学习中的问题和解决过程+2.代码调试中的问题和解决过程+2.感想,体会不假大空+1.错题学习深入+1.点评认真,能指出博客和代码中的问题+1.结对学习情况真实可信+1.课后题有验证+1,进度条有记录+1.

  • 参考示例

点评过的同学博客和代码

  • 本周结对学习情况

  • 上周博客互评情况

其他(感悟、思考等,可选)

  • 每节课的考试让我十分吃不消,不只是英语单方面的问题,Java也有许多问题亟待解决,因为课本版本不同,找起知识点来比较麻烦。
  • 好多同学好牛,自己好菜,各种把打好的代码推翻重来,参考别人代码改来改去把自己的程序变成了四不像,运行不了,本周更加熟悉了运行一个目的堆了四五个程序的Java常态,继续虚心学习吧。
  • 实验作业越来越难,我越来越菜,随时gg。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 350/500 2/4 24/38
第三周 512/1000 3/7 22/60
第四周 1158/1300 4/9 35/90
第五周 2905/3000 6/5 24/24
第六周 3927/4000 2/2 26/30
第七周 9401/6000 3/4 30/50
第八周 9401/7000 1/1 30/30
第九周 12800/8000 3/3 48/30

参考资料