概念
堆是一種圖的數據結構,被用於實現「優先隊列」。 優先隊列是一種數據結構,能夠自由添加數據,但取出數據時要從最小值開始按順序取出。在堆的樹形結構中,各個頂點被稱爲「結點(node)」,數據就存儲在這些節點中。node
堆的特色
如圖所示,每一個節點由兩個子節點,用線條鏈接即爲堆。算法
- 結點內的數字就是存儲的數據
- 堆中的每一個結點最多有兩個子節點
- 樹的形狀取決於數據的個數
- 節點的排列順序爲從上到下,同一行裏則爲從左到右
- 堆的父節點必須小於子結點
堆的數據存儲
在堆中存儲數據時必須遵照這樣一條規則:子結點一定大於父節點數據結構
- 頂端的結點爲根節點存儲的數據爲堆中的最小值
- 新數據增長時會被放在堆的最底部靠左的位置
- 堆的底部沒有多餘空間時,會另起一行把數據加在這一行的最左端
例如,將數字5添加到堆中3d
- 結點6有個空位置,將數字5加在結點6中
- 數字5結點的父結點大於自己,故調換位置
- 交換完畢後數字5結點的父節點小於自己,因此再也不交換,往堆中插入數據5的操做結束
堆的數據獲取
從堆中獲取數據時,須要從最上面的數據開始取,取完數據後,堆須要進行從新排序,將最後的數據移到取出的結點位置。cdn
如圖所示,取出堆中的數字1。 blog
- 1被取出後,結構須要從新調整
- 將最後的數字6結點移到最頂部
- 若是子結點的數字小於父節點,就將父節點與其左右兩個子節點中較小的一個進行交換
- 數字6結點的子結點3和5,3爲較小者。故與3進行位置調換
- 交換後,數字6結點的兩個子節點4和8,4爲較小者。故與4進行位置交換
- 交換後,數字6結點無子節點。故交換完畢,從堆中取出數據的操做完成
寫在最後
- 文中使用的圖片源自《個人第一本算法書》,如若侵權,請評論區留言,做者當即刪除相關圖片。
- 文中若有錯誤,歡迎在評論區指正,若是這篇文章幫到了你,歡迎點贊和關注😊
- 本文首發於掘金,未經許可禁止轉載💌