20182305 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结
20182305 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结
教材学习内容总结
这一周的学习内容为教材第十六、七章,主要就是和树有关的内容
-
树。
- 树就是字面意思,像树一样发展壮大的一种储存数据的结构,由最开始的一个数据(树根)分叉出来,越来越多。
- 树根:位于树顶层的节点。
- 双亲和孩子:一个节点相连的下一层节点成为这个节点的孩子。这个节点称为他孩子的双亲。
- 兄弟:双亲相同的节点互相称为兄弟。
- 叶子:没有孩子的节点。
- 深度:树的层数。
- 阶:节点的阶就是这个节点的孩子数;树的阶数是整个树中,阶数最大的节点的阶。
-
二叉树:每个节点最多有两个孩子。如果每个节点都有两个孩子,这个树叫完全二叉树。
-
树的实现:
- 数组实现:使用数组实现树,数组下标为n的结点的左子树下标为2n,右子树下标为2n+1。
- 链表实现:链表是最常见的造树方法,二叉链表可连接左右节点,三叉链表可指向父节点。是比较常用的实现树的方法。
-
树的遍历:递归遍历比非递归遍历更简单,参照一个顺序的遍历可以写出其他顺序的遍历。
前序遍历:先根节点,再左子树,最后右子树
中序遍历:先左子树,再根节点,最后右子树
后序遍历:先左子树,再右子树,最后根节点
- 二叉树查找:关键点在于以一个根节点为准,左侧都是比它小,右侧都它大于等于它。查找时,就从头挨个比较,小就往左子树找,大就往右子树找。
教材学习中的问题和解决过程
-
问题一:使用树进行存储数据时,怎么样设定区分标准,将新的数据存入左子树还是右子树,会更有利于存储和后续查找取出使用。如何提高效率。
-
问题一解决办法:例如常用的储存和查找。在储存时设定一个根,就以这个根作为标准进行比较。比他小递归方法进入左子树去继续比较,比他大就右子树处理。但是储存结束后会出现,这个树不平衡,某一侧数据特别多,导致这颗树失去平衡。就需要对这个树进行旋转。
-
问题二:树在使用中,遍历方法如何使用,究竟是递归更好、还是非递归更好。
-
问题二解决方法:从代码效率来说,肯定是递归方法更好,因为递归方法简洁,效率高,也节约代码行数。但是不容易想,也需要严格设置递归循环终止的条件。否则极易出错。
代码调试中的问题和解决过程
- 问题一:左子树无法于根节点连接。在设置
root.left = temp;
时,编译没有任何报错,但是运行时会出现空指针异常。提示在打印root的内容处。单步调试发现是在这一句root.left指向temp时无法正常指向。 - 问题一解决方法:使用方法重写换了一个定义方法,在定义上一级节点时,直接将左右子节点定义上去。并更改思路,先定义最底层节点,从最下方往上定义、链接。
代码托管
上周考试错题总结
其他(感悟、思考等, 可选)
还是要提高效率啊,这样可不行。
这样下去,期末的其他科目可是难以保证。
还是要增加理解,提高效率。既是提高代码效率也是提高自己的效率。
加油吧,坚持下去,快放假了。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 6000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 17/17 | |
第二、三周 | 556/756 | 3/5 | 31/48 | 明白了类与方法的关系,对Java编程的思想的了解有了一些进步 |
第四周 | 673/1429 | 2/7 | 12/60 | 对两段代码之间的关系了解了一些 |
第五周 | 1308/2737 | 2/9 | 25/85 | |
第六周 | 800/3537 | 2/11 | 18/103 | |
第七周 | 4195/7732 | 2/13 | 27/130 | |
第八周 | 489/8221 | 1/14 | 6/136 | |
第九周 | 2893/11114 | 3/17 | 30/166 |
-
计划学习时间:20小时
-
实际学习时间:30小时
-
改进情况:本来想多分一些时间给其他科目,结果这段时间里的课程难度实在是……一言难尽。让我不得不拿出更多时间来学Java。希望下周的时间能多一些空闲,让我学一下其他科目,我不想挂科!!!!!(Wa的一声)