【數據結構】堆
定義
(1)堆是一個完全二叉樹。(除了葉子節點,其他節點的值都是滿的)
(2)堆中每一個節點的值都必須大於等於(或者小於等於)其左右節點的值。 對於每個節點的值大於等於子樹的值,稱為大頂堆。反之稱之為小頂堆。
圖示(大頂堆):
堆的實現
因為堆的執行(完全二叉樹),他適合用數組直接進行存儲。數組中下標為i的節點的左右節點為為i*2, i*2+1。而任意一個節點i的父節點是i/2。這裏我們在平時可以選擇下邊1作為第一個節點,有助於理解和代碼的書寫。如果我們用下標0作為第一個節點的話, 其子節點為(i+1)/2 ,(i+1)/2 +1。
堆的操作
插入操作 :
堆化過程:從下往上堆化。
從下往上堆化過程:先將數據插入到數組尾部,然後比較其父節點關系,然後繼續進行交換。直到最後滿足堆的性質。
實現代碼
明天補上
刪除操作:在堆中我們一般都是刪除堆頂的元素,很少刪除指定下標節點的情況。所以我們還是只討論對於堆頂元素的刪除情況。
堆化過程:從上往下堆化。
從上到下進行堆化過程:在堆化的圖示過程中我們可以看待,這種情況會導致最後完成之後不能滿足完全二叉樹的情況。從而也就破壞了堆的性質。
鑒於此情況,我們可以將待刪除的元素和數組中最後一個元素進行對調,然後從堆頂從一次向下進行堆化,直到最後滿足定義。這樣完畢之後他還是滿足完全二叉樹的定義。圖示如下:
代碼實現
復雜度分析:在對對進行操作時都不需要申請輔助空間,所以其空間復雜度為O(1),而對於時間復雜度,由於是以完全二叉樹的性質進行存儲的,從根節點到葉子節點的高度為log n ,因此在堆化的過程中時間,無論是插入操作還是刪除操作其時間復雜度為O(log n)。
【數據結構】堆