20162317 2017-2018-1 《程序设计与数据结构》第9周学习总结 18章 堆
20162317 2017-2018-1 《程序设计与数据结构》第9周学习总结 18章 堆
教材学习内容总结
1、 堆的引入
.
2、堆的用处
1.实现优先队列
2.总能方便地得到元素集合中的最大(小)值(最大(小)值在根部)
3.能够用来进行排序
3、堆的概念与性质
4、 堆的实现
教材学习中的问题和解决过程
- 问题1:我在课本中看到这么一句话:“堆是一棵完全二叉树,其中每个元素都要大于或小于它的所有孩子”但下面的关键概念中也写着:“堆是一棵完全二叉树,其中每个元素大于等于其所有子结点的值”那每个元素是大于或小于其所有子结点还是大于等于其所有子结点??
- 问题1解决方案:翻阅书后面的自测题SR18.1的答案,上面写着:“堆中的结点大于等于它的两个子结点”。
因此可以得出结论,应该是每个元素大于或等于其所有子结点的值。
补充:实际上,上面我得到的结论是最大堆的结论,最小堆的性质是:每个元素都小于等于它的孩子,也就说明了小于也是正确的。
- 问题2:我在书中看到这么一句话:“堆是一种经典的是数据结构,常用来实现优先队列”,什么是优先队列,它与队列是否不同,若不同,不同处在哪里??
- 问题2解决方案:在书的后面有对优先队列进行解释:
- 具有更高优先级的项排在前面
- 具有相同优先级的项按先进先出的规则排序
- ...
代码调试中的问题和解决过程
- 问题1:在单步跟踪LinkedMaxHeap的过程中,有个add方法:
@Override
public void add(T element) {
HeapNode<T> node = new HeapNode<T>(element);
HeapNode<T> newParent = null;
if (root == null) {
root = node;
} else {
newParent = ((HeapNode<T>) root).getParentAdd(last);
if (newParent.getLeft() == null) {
newParent.setLeft(node);
} else {
newParent.setRight(node);
}
}
node.setParent(newParent);
last = node;
((HeapNode<T>) root).heapifyAdd(last);
}
其中有段代码:
node.setParent(newParent);
在add方法中已经明确表明
newParent.setLeft(node);
那设置node结点的父节点是newParent有什么意义?
- 问题1解决方案:解决这个问题要结合HeapNode的代码。在HeapNode的代码中有个HeapNode的变量parent,在里面的很多方法里面,都有用到这个变量,书上也有说:“有到父节点的引用,这样就可以沿树中的路径移动。”因此setParent方法是在堆中必要的
- 问题2:在看HeapNode中的heapifyAdd方法的时候,看到这么一句代码:
current = current.parent;
current都成为它自己的父节点了,那子结点还在吗?
- 问题2解决方案:在!current只是当前结点的其中一个引用罢了,上面那段代码只是引用改变了而已,堆还是原来的样子。
代码托管
上周考试错题总结
- 错题1:在一棵二叉查找树中,左子树的元素________根的元素
A.大于
B.小于
C.大于或等于
D.小于或等于
E.等于
我的答案:B 标准答案:D
解析:当出现元素重复的情况,一个元素会作根,另一个相同的元素会作根的左子结点或右子结点
学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)
| -------- | :----------------😐:----------------😐:---------------: |:-----😐
| 目标 | 5000行 | 15篇 | 400小时 | |
| 第一周 | 200/200 | 2/2 | 20/20 | |
| 第二周 | 20/220 | 1/3 | 20/40
| 第三周 | 645/865 | 1/4 | 14/54 | |
| 第五周 | 654/1519 | 1/5 | 18/72
| 第六周 | 436/1955 | 1/6 | 16/88 | |
| 第七周 | 839/2794 | 2/8 | 20/108 |
| 第八周 | 2143/4937 | 2/10 | 25/133 |
| 第九周 | 1368/6305 | 2/12 | 18/151 ||
-
计划学习时间:16小时
-
实际学习时间:18小时