20172304 《程序设计与数据结构》第六周学习总结
20172304 《程序设计与数据结构》第六周学习总结
教材学习内容总结
本周主要学习的是树的内容,树由结点和边组成,位于树中较低层的结点是上一层结点的孩子。一个结点只有一个双亲,统一双亲的两个节点称为兄弟。没有任何孩子的 的结点称为叶子。一个至少有一个孩子的非根结点称为一个内部结点。如果一个结点在从跟开始的路径中位于另一结点之上,则该节点就是它的祖先。沿着其实子某一特定节点的路径可以的到达的结点是该节点的子孙。
10.1.1树的分类
树中任一结点可以具有的最大孩子数目交租该树的度。对结点所含有的孩子数目无限制的数称为广义树。我们将每一节点先只为不超过n个孩子的树称为一棵n元树。节点最多具有两个孩子的树称为二叉树。如果一个树的所有叶子都位于同一层或者至少彼此相差不超过一个层就称之是平衡的。一棵含有m个结点的平衡n元树具有的高度为lognm。
完全树:如果某树是平衡的,且所有叶子都位于树的左边,则认为树是完全的。完全树在每个k层上都具有2^k个结点。
满树:如果一棵n、元树的所有叶子都位于同一层且没一结点要么是一篇叶子要么正好具有n个孩子,则称树是满的。
10.2实现树的策略
10.2.1树的数组实现值计算策略。
使用数组来储存一棵树:对于任何储存在数组位置n处的元素而言,该元素的左孩子将储存在位置2n+1处,该元素的右孩子则储存在位置(2×n+1)处。
10.2.2数的数组实现之模拟链接策略
树的遍历:前序遍历,中序遍历,后序遍历,层序遍历。
名称 | 内容 |
---|---|
前序遍历 | 从根结点开始,访问每一结点及其孩子 |
中序遍历 | 从根结点开始,访问结点的左孩子,然后是该结点,再然后是任何剩余结点。 |
后序遍历 | 从根结点开始,访问结点的孩子,然后是该结点。 |
层序遍历 | 从根结点卡斯和,访问每一层的所有结点,一次一层 |
前序遍历
伪代码
Visit node
Traverse(left child)
Traverse(right child)
中序遍历
伪代码
Traverse(left child)
Visit node
Traverse(right child)
层序遍历
伪代码
Create a queue called nodes
Create an unordered list called results
Enqueue the root onto the nodes queue
While the root onto the nodes queue
While the nodes queue is not empty
{
Dequeue the first element from the queue
If that element is not null
Add that element to the rear of the results list
Enqueue the children of the element
Else
Add null on the result list
}
Return an iterator for the result list
10.4 二叉树
二叉树基本操作方法
操作 | 说明 |
---|---|
getRoot | 返回指向二叉树的引用 |
isEmpty | 判定该树时是否为空 |
size | 判定树中的元素数目 |
contains | 判定目标是否在该树中 |
find | 如果找到指定元素,则返回指向其的引用 |
toString | 返回树的字符串表示 |
itertorInOrder | 为树的中序遍历返回一个迭代器 |
itertorPreOrder | 为树的前序遍历返回一个迭代器 |
itertorPostOrder | 为树的后续遍历返回一个迭代器 |
itertorLevelOrder | 为树的层序遍历返回一个迭代器 |
二叉树的应用:表达式树,背部疼痛诊断器
用链表实现二叉树
教材学习中的问题和解决过程
- 问题1:在进行书上代码测试时,发现BackPainAnalyzer测试类会报异常。如图。
- 问题1解决方案:因为这是书上的代码,所以请教了同学,在王志伟同学的帮助下,明白了这种调用无法调用其的子树。只要添加代码
LinkedBinaryTree left,right
然后在LinkedBinaryTree类的构造方法里加入this.left=left,this.right=right就可以了。
代码调试中的问题和解决过程
- 问题1:在实现树的时候发现构造的树和实际打印的树不一致
- 问题1解决方案:然后发现是在调用方法时用错了对象,将应该调用树的位置错用了其子树的对象。
错题总结
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
-错题一
-问题解答:这道题错的原因是我错将书上的查找的时间复杂度错认为二叉树的时间复杂度。列表的时间复杂度是与查找方法有关的,但是二叉树的查找必须要遍历每个元素。所以时间复杂度应该是O(n)。
- 错误二
-问题解答:错将不能连续分配看成了能够连续分配。 - 错误三
-问题解答:中序遍历从根节点开始,访问结点的左孩子,然后是该结点,再然后是任何剩余结点。
博客互评
20172304郭恺郭恺同学的博客依然是一如既往的优秀,既将教材中的内容总结的详略得当,还能具体而全面的对自己的错误进行总结和提升。
20172328李馨雨理性与同学的博客还是很认真的。
点评过的同学博客和代码
- 上周博客互评情况
20172304郭恺同学本次的博客十分优秀,对教材的总结详略得当,而又针对自己在教材中发现的问题进行了深入的鞭辟入里的思考与解答。整个过程看起来赏心悦目给人一种美的享受。
20172328李馨雨同学的博客十分的完整与丰富,体现了她认真的学习态度。
其他(感悟、思考等,可选)
本周经过了学习了解了树的相关知识,树与其说是一种数据结构更不如说是逻辑结构。他是建立在基础数据结构之上的,比如数组,栈,或者链表。合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。只有经过充分的积累。充分学习了基础的数据结构,才能做出跟多优秀的代码。才能更好的建设中国特色社会主义。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 30/30 | 1/1 | 10/10 | |
第二周 | 766/796 | 1/2 | 40/50 | |
第三周 | 817/1613 | 1/3 | 20/70 | |
第四周 | 1370/3983 | 2/5 | 30/100 | |
第五周 | 1235/5214 | 1/6 | 10/110 | |
第六周 | 1328/6542 | 1/7 | 20/130 |
参考资料
1.蓝墨云班课
2.java软件结构与数据结构