20182302 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结
教材学习内容总结
**二叉排序树*
- 1、平均编码长度:各字符编码长度Li与出现概率Pi之积求和
2、平均编码长度短的有更好性能
3、编码:概率大的编码短,概率小编码长
4、树的带权路径长度
5、最优二叉树/哈夫曼树:带权路径长度最小的二叉树。在哈夫曼书中,带权值越短的
6、构造哈夫曼树
7、已知的最佳无损解压算法 - 二叉查找树:即用循环寻找要找的元素,原理简单,注意:二叉树有一共同特点,即先确定左子树,再确定右函数。
- 二叉树删除:删除要分三种情况
(1)删除叶子结点:直接找到到删除的节点的父节点,使父节点的相应左右子树等于null。
用子节点代替他。
(2)删除含一个子结点的结点(左或右):直接用子节点代替他。
(3)删除含左右两个结点的结点:此种类最为复杂,我的方案是先将树中序遍历,取待删除结点前面的一个元素,再在树中寻找这个结点。将这个结点删除,再将待删结点的值改为先前找到的值。
树
- 树的遍历:
(1)先序遍历:先访问根,再访问左右子树。
(2)中序便利:先遍历左子树,再访问根节点,再访问右子树。
(3)后序遍历:先便利左子树,再遍历右子树,最后遍历根节点。
- 树的分类:
一种是树中任一结点可以具有的最大孩子数目。这个值有时称为该树的度。所含孩子无限为广义树;每个结点限制为不超过n个孩子的树称为n元树。最多两个孩子的叫二叉树。
另一种是该树平衡与否。如果树的所有叶子都位于同一层或至少是彼此相差不超过一个层,就称之为平衡的。 - 完全树是如果某树是平衡的,且底层所有叶子都位于树的左边,则是完全的
- 满树是如果一棵n元树的所有叶子都位于同一层且每一结点要么是一片叶子要么正好具有n个孩子,则称树是满的
教材学习中的问题和解决过程
- 问题1:对字符流,字节流理解存在困难
- 问题1解决方案:通过交流询问和查阅课本找到相关概念区别。:字符流使用了缓冲区,而字节流没有使用缓冲区。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)。
- 问题2:哨兵的设立及其作用?
- 问题2解决方案:哨兵结点通常在排序中使用,可提高效率。设为a[0],实际上原来的栈并不代表表中的元素。使用哨兵结点,实现带哨兵结点或虚位结点作为第1个结点的表,可以去掉处理第 1 个结点这种特殊情形
- 问题3: 对pop,push等存在以往和疑问
- 问题3解决方案:通过仔细阅读理解老师所给ppt理解pop和push作用
代码调试中的问题和解决过程
- 问题1: Scan方法遗忘
- 问题1解决方案:通过以前代码想起格式
Scanner sc=new Scanner(System in);
- 问题2:对数组输入方式有所遗忘
- 问题2解决方案:百度查询得
System.out.println("请输入几个数并用逗号隔开:"); Scanner sc = new Scanner(System.in); String str = sc.next().toString(); String[] arr = str.split(","); int[] b = new int[arr.length]; for(int j = 0; j<b.length;j++) { b[j] = Integer.parseInt(arr[j]); }
————————————————- 问题3:教材代码中的ArrayIterator类无法被识别
- 问题3解决方案:修改方法的定义类型为ArrayList
- 问题4::栈中空间不足
- 问题4解决方案:可以利用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; } }
代码托管 (书中代码)
上周考试错题总结
D The definition of a binary search tree is an extension of the definition of a ______________.
A .stack
B .queue
C .list
D .binary treeB The balance restriction on a red/black tree is somewhat less strict than that for AVL trees. However, in both cases, the find operation is order ______.
A .n
B .log n
C .n log n
D .None of the aboveB In removing an element from a binary search tree, another node must be demoted to replace the node being removed.
A .True
B .Flase- B The balance restriction on a red/black tree is somewhat less strict than that for AVL trees. However, in both cases, the find operation is order n.
A .True
B .Flase - C A minheap stores its smallest element at the ________ of the binary tree.
A .leaf
B .internal node
C .root
D .sibling - C Typically, in heap implementations, we keep track of the position of the last node or, more precisely, the last leaf in the tree.
A .root
B .internal node
C .leaf
D .tree - A Though not a queue at all, a minheap provides an efficient implementation of a _____________.
A .Priority queue
B .Circular queue
C .Deque
D .None of the above - B The addElement operation for both the linked and array implementations is O(__________).
A .n
B .log n
C .n log n
D .None of the above - B Since a heap is a binary search tree, there is only one correct location for the insertion of a new node, and that is either the next open position from the left at level h or the first position on the left at level h+1 if level h is full.
A .True
B .Flase - D Which of the following is not an operation on a stack?
A .push
B .pop
C .peek
D .dequeue
E .all of the above are operations on a stack - 出列操作是队列操作。
- When one type of object contains a link to another object of the same type, the object is sometimes called __________ .
A .circular
B .recursive
C .self-referential
D .a stack
E .a queue 自引用对象是指同一类型的另一个对象。
结对及互评
点评:
- 博客中值得学习的或问题:
- 问题:排版能力仍需提高
- 代码中值得学习的或问题:
- 本周代码总量较上多
- 对本周知识点进行及时复习,上课认真听讲记录
- 代码编写时规范性有待提高
- 基于评分标准,我给本博客打分:13分。得分情况如下:正确使用Markdown语法(加1分)模板中的要素齐全(加1分)教材学习中的问题和解决过程(加2分)代码调试中的问题和解决过程(加2分)本周有效代码超过300分行(加2分)感想,体会不假大空(加1分)进度条中记录学习时间与改进情况(加1分)结对学习情况真实可信(加1分)有动手写新代码(加1分)点评认真,能指出博客和代码中的问题的(加1分)
点评过的同学博客和代码
- 本周结对学习情况
- 结对学习内容
- 栈的pop,push,isEmpty,expandCapacity,peek
- 二叉排序树的使用
-如何在查找失败时返回false
- 上周博客互评情况
其他(感悟、思考等,可选)
平时缺少复习,对知识点记录应向其他同学学习。如何使用二叉排序树相关操作有待多练习,对于树结构理解不够,仍需继续学习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 6000行 | 25篇 | 300小时 | |
第一周 | 143/143 | 2/2 | 7/7 | 学会对虚拟机进行基础设置,学会git程序简单使用 |
第二周 | 388/531 | 3/5 | 10 /17 | 学会部分基础编码,掌握循环格式话输出等内容 |
第四周 | 807/1338 | 1/6 | 17/34 | 学会运用IDEA编写和测试代码 |
第五周 | 1289/2096 | 2/8 | 17/51 | 学会运用IDEA编写和测试代码 |
第六周 | 1005/3101 | 2/10 | 19/70 | 学会继承封装多态 |
第七周 | 2240/5341 | 2/12 | 15/85 | 学习栈,队相关操作 |
第八周 | 404/5745 | 2/14 | 17/102 | 学习查找,排列相关操作 |
第九周 | 2855/7600 | 3/17 | 12/114 | 学习二叉排序树相关操作 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
- 计划学习时间:20小时
- 实际学习时间:15 小时
改进情况:课下有一定复习,对二叉排序树理解有一定提升,但对最近所讲树相关内容应用时吃力。
参考资料
- 《Java程序设计与数据结构教程(第二版)》