本章的內容主要講堆的知識,而所謂堆就是一種具備一些特殊屬性的樹,就像二叉查找樹同樣。而堆也有兩種分類,分別是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。