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的一声)

posted @ 2019-11-19 22:49  20182305孙铭泽  阅读(193)  评论(2编辑  收藏  举报