堆是一種特殊的完全二叉樹
- 完全二叉樹即除了最後一層其它層都是滿的,且最後一層的數據全部靠左排列。
- 特殊在,他的每個節點的值都大於等於(或者小於等於)其子樹節點,因此堆又分爲大頂堆和小頂堆。
因爲是完全二叉樹,我們存儲堆的時候一般使用數據來存儲,第一個0號元素留空,這樣的話節點是a[n],左節點就是a[2n],右節點就是a[2n+1],父節點就是a[n/2]。當然不留空也可以,推算父節點的時候總是要先進行-1操作。
堆主要有兩個操作
- 刪除堆頂元素
- 插入一個元素
這兩個操作都涉及到了堆化(重新調整,使其滿足堆的特性),刪除堆頂元素我們選擇的是把最後一個元素移到堆頂來,從上而下堆化(比較當前節點和子節點的大小,不滿足則互換位置)。插入一個元素我們選擇把元素插入到最後,然後從下往上堆化(比對當前節點和父節點的大小,不滿足則互換位置)。