二叉堆是一種優先隊列的數據結構,具有2種性質:結構性質和堆序性。這裡討論都基於最小二叉堆,這種二叉堆對最小元素的訪問非常高效。
二叉堆的ADT操作主要包括Insert(插入)和DeleteMin(刪除最小元)。
1、結構性質:堆是一棵完全二叉樹(若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 都被填滿,第 h 層所有的結點都連續集中在最左邊),如下圖。
(1)因為完全二叉樹很有規律,因此可以用一個數組而不需要用指針存儲,可以存儲成如下形式,其中[0]地址處元素常常用於標記(對於最小二叉堆而言,存儲一個非常小的值),這只是為了編程方便,當然也可以不用該標記。
(2)對於數組中任一位置i處的元素,其左兒子在位置2*i上,右兒子在2*i+1上。這條信息很有用,也正因為這樣,我們可以很方便的不用指針而只用數組就能訪問左右兒子。
2、堆序性:
由於我們想快速的找到最小元,因此最小元應在根上。我們可以以O(1)時間找到最小值。
堆序性指,在一個堆中,每一個節點X,X父親中的關鍵字小於(或等於)X中的關鍵字,根節點除外(因為沒有父親)。
3、插入
為將一個元素 X 插入到堆中,我們在下一個可用位置創建一個空穴,否則該堆將不是完全數。如果 X 可以放在該空穴中而不破壞堆的序,那麼插入完成。否則,我們把空穴的父節點上的元素移入該空穴中,這樣,空穴就朝著根的方向上冒一步。繼續改過程直到 X 能被放入空穴中為止。
這樣一般的策略叫做上濾( percolate up );新元素在堆中上濾直到找出正確的位置。