数据结构之「堆」
堆
堆 是一種特殊的完全二叉樹結構,通常,它有兩種類型:最小堆 和 最大堆。
最小堆(min heap)是父節(jié)點的值恒小于等于子節(jié)點的值。
最大堆(max heap)是父節(jié)點的值恒大于等于子節(jié)點的值。
二叉堆的性質
任意節(jié)點小于(或大于)它的所有子節(jié)點,最小值(或最大值)在堆的根上。
堆總是一棵完全樹。即除了最底層,其他層的節(jié)點都被元素填滿,且最底層盡可能地從左到右填入。
二叉堆的實現
堆的存儲結構
堆一般可以用數組的方式來存儲,數組的順序其實就是堆層級遍歷的結果。
堆的插入
由于堆是一個完全二叉樹,每次總是先填滿上一層,再在下一層從左往右依次插入。
插入步驟:
1.首先將新元素增加到堆的末尾。
2.然后在新元素與其父節(jié)點的值比較,如果新元素小于父節(jié)點的值則將兩者交換位置。
3.不斷進行第2步操作,直到不需要交換元素,或者達到堆頂。
最后就會得到一個最小堆,上面交換元素的過程叫做上濾。
堆的刪除
堆的刪除和插入操作是剛剛相反的,插入是從下往上調整堆,刪除是從上往下調整堆。
刪除步驟:
1.首先刪除堆頂元素。
2.然后在比較左右子節(jié)點,將小的元素上調。
3.不斷進行步驟2,直到不需要調整或者調整到堆底了。
上面交換元素的過程叫做下濾。
總結
堆有兩種類型,最大堆和最小堆,并且堆總是一顆完全樹。
由于堆的 父節(jié)點的值恒小于等于子節(jié)點的值 或者 父節(jié)點的值恒大于等于子節(jié)點的值,可以作為 Top n 使用。
堆(通常是二叉堆)常用于排序。這種算法稱作堆排序。
PS:
清山綠水始于塵,博學多識貴于勤。
我有酒,你有故事嗎?
微信公眾號:「清塵閑聊」。
歡迎一起談天說地,聊代碼。
總結
- 上一篇: 【题解】P4124 [CQOI2016]
- 下一篇: 你真的理解JS的继承了吗?