数据结构:第五章学习小结

第五章学习了树,其中二叉树占比最大。对我来说这一章是挺难的一章,主要是知识点很多,且每个都不简单。接下来我会将本章分成三个部分来总结。

一、书上知识点

  1. 遍历:层次遍历和先序遍历都很好理解,但是中序遍历和后序遍历却得拐一下弯。虽然我在自己看视频和书的时候感觉很简单,但是得做题的时候却发现完全不是那么一回事。一开始觉得左根右顺序只把根结点在中间输出就行了,而其他结点还是按的先序输出,也就是一开始根本没把除根结点外的其他有孩子的结点当成“根”对待,在学习后序遍历的时候也犯了同样的错误。还好老师出了习题,不然会对以后的打代码过程造成很大的影响。
  2. 递归:虽然从上学期学习递归之后也陆陆续续接触了一些用递归做的编程题,但是我对他的理解还不是很透彻,在学习二叉树代码的过程中,也对他有了一些更深的理解,也看到了他的实用性和简洁性。
  3. 哈夫曼树:在看视频和书的时候觉得挺容易理解的,但是在做题的时候就会犹豫纠结——如果有两个数相同的话哪个和另一个最小数组队呀?落单的那一个结点放在那一层呢?所以听懂不等于会做,实战才是检验是否学会的唯一方法。

 

二、代码收获

  1. 在树的代码过程中接触到的新知识就是STL的queue的应用了,使用起来很方便,但是查资料的时候发现这是一个很庞大的体系,还得等着我们慢慢去挖掘。不过多多使用就会熟练了。下面是以层次遍历为例的queue的使用方法

    2.小组讨论协作

这道题最后我们只得了70分,但这70分中也有我们投机取巧的成分在。我们的代码思路是给定一个有孩子数以及存储孩子数据的数组,数组大小为100001,在定义一个由100001个结点及根结点数据组成的结构体,

如下图

 

显然,空间是不够的,但除了空间问题,其他所有问题都解决了,于是我们将两个数组的给定空间都减小到100,才得到了70分。但在打代码之前,我们的思路也换了好几次。

思路一

首先想到的是用链表,构造一个数组,里面存着指向他们的孩子数据数组的指针,但是按照我们的想法,每个链表都是单独的,是串联不到一起的,让他们怎么成为一个有联系的树难倒了我们,所以就放弃了这个思路。

思路二

先将叶子结点筛选出来,同时在结构体里要有孩子和双亲两个元素,使用队列,将每一个叶子结点分别入队,让他们的双亲结点也入队,直到根结点入队,将这些队列进行比较,队列最长的队的第一个数据即为所求结点。但是由于我们只想着用STL中的queue进行队列里的操作,所以这个思路也中断了。

三、接下来的学习

学了几章之后发现,其实老师出在spoc上的讨论题是巩固所学内容的特别好的地方,所以我以后要多看几个大家提交的讨论题的答案,总会有我想不到的点子以及未注意到的知识点。

posted on 2020-05-30 16:00  侯艺雯  阅读(212)  评论(0编辑  收藏  举报