本章的内容主要讲堆的知识,而所谓堆就是一种具备一些特殊属性的树,就像二叉查找树同样。而堆也有两种分类,分别是html
最大堆
java
最小堆
git
可是不管是最大堆仍是最小堆的第一个特殊属性均为:算法
第二个特殊属性是:api
但本章的内容主要以最小堆为例,学会了最小堆能够类比退出最大堆的性质。数组
由于堆是一种含有特殊属性的树,因此在本章中堆继承了之前二叉树的全部性质,本章仅仅是在BinaryTreeADT
基础上添加了addElement
、removeMin
、findMin
方法。数据结构
addElemnt
方法:由于堆是一个彻底树,因此说所添加元素的位置一定为堆的最后一层或最后一层以后的左边第一个位置。但在添加元素后还须要考虑整个堆的属性是否保持完成,因此说须要考虑从新排序。removeMin
方法:删除堆的根结点后从新排序。findMin
方法:简单的返回根结点的操做。与以往相似,本次分别利用链表和数组实现堆。less
HeapNode
类继承BinaryTreeNode
类,但因为BinaryTreeNode
无双亲结点的存在,因此在HeapNode
中添加了一个双亲指针。(值得注意的是,添加双亲结点的缘由是:在咱们插入元素以后咱们须要向上遍历该树,因此必须存在一个指向双亲的指针)
addElement
方法的复杂度是O(logn),与此方法同时存在的是getNextParentAdd
和heapifyAdd
方法,他们用于返回插入结点的双亲的引用和对添加元素后的堆进行重排序。removeMin
方法的复杂度同为O(logn),与此方法同时存在的是getNewLastNode
和heapifyRemove
方法,他们用于返回新插入的节点和对删除元素后的堆进行重排序。findMin
方法:return root.element
HeapNode
类。
addElement
、removeMin
、findMin
方法的解释与利用链表实现堆相似,我的以为无需过多言语。本章的内容就是对以前内容的简单拓展,实在是找不到什么问题。若是真的要我找一个问题就是:学习
PriorityQueue
的基础上删除了实现优先级的代码,就实现啦。20172303设计
(本部分用于收集本章节后的生词)
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/5000 | 2/2 | 8/8 | 认真学习!积极向上 |
第二周 | 812/812 | 1/3 | 22/30 | |
第三周 | 814/1626 | 1/4 | 20/50 | |
第四周 | 1386/3012 | 2/6 | 20/70 | 愉快的国庆节就要结束了... |
第五周 | 1222/3234 | 1/7 | 30/100 | |
第六周 | 1327/4561 | 2/7 | 30/100 | 啦啦啦啦啦 |
第七周 | 1170/5631 | 1/8 | 33/133 | |
第八周 | 1250/6881 | 2/10 | 30/163 |
计划学习时间:25小时
实际学习时间:30小时
改进状况:根据学姐的建议改进了commit。