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,则返回 falseinterface 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) {
Demop = null; // 编译正确
//这里因为ArrayList是List的子类所以通过
//如果改为Demop = 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(先进先出)数据结构,这意味着放入队列的第一个元素是从队列中删除的第一个元素。
结对及互评
评分标准
-
正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
-
模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
-
教材学习中的问题和解决过程, 一个问题加1分
-
代码调试中的问题和解决过程, 一个问题加1分
-
本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
-
其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
-
扣分:
- 有抄袭的扣至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 |