二叉堆一般用來實現優先佇列;優先佇列是一種至少允許以下兩種操作的資料結構:insert 以及 deletemin;
同查詢樹一樣,二叉堆具有結構性與堆序性,對二叉堆的基本操作可能會破壞這些性質,所以二叉堆的操作要直到其基本性質滿足才能結束。
一、結構性
二叉堆在結構上為完全二叉樹,其具有完全二叉樹的結構性質,如在第k層的結點數,k層的樹的最多結點數,k個結點的樹的高度等。
二、堆序性
堆序效能使操作快速執行,二叉堆常用來作為優先佇列,其需要能快速查詢與刪除最小值,使用在二叉堆中最小值放在根結點中,由於樹的遞迴定義,子樹的根節點也為子樹中的最小值,所以在根節點與其子節點中,根節點的值不大於其子節點。
其基本操作:
1、插入
插入元素需要維持堆的兩大性質,堆序性的維持需要一些額外的操作;由於插入元素,新建了乙個結點在堆的末尾,這裡採用一種稱為上濾的方法:在堆的末尾新建乙個空結點,從新建的空結點出發,若其父親的值大於插入元素,就使空節點上濾,父親結點與空節點交換,直到找到某結點的父親結點的值小於插入值或是找到根節點,由於其沒有父親,查詢結束;對於根節點的處理,通常新增乙個標記,其為element[0],設定其值比堆中任意元素小來使while迴圈結束;該操作複雜度為 o( log n )
2、刪除
同插入一樣,刪除元素也要保持堆的性質不變;保持性質需要將堆中的最後乙個結點移動到堆中。這裡使用一種稱為下濾的技術:將根節點刪除後,視為空結點,從根節點開始,將其子節點中較小的上濾,即空結點與較小的子節點交換,若找到某個結點的最小孩子的值大於最後乙個結點的值且該節點有兩個孩子,則交換;直到結點沒有孩子結束尋找,該節點即為最後乙個結點插入位置;
實現**:
struct heapstruct;
typedef struct heapstruct *priorityqueue;
priorityqueue initialize( int maxelements );
void destory( priorityqueue h );
void makeempty( priorityqueue h );
void insert( elementtype x, priorityqueue h);
elementtype deletemin( priorityqueue h );
elementtype findmin( priorityqueue h );
int isempty( priorityqueue h );
int isfull( priorityqueue h );
struct heapstruct
;priorityqueue initialize( int maxelements )
h->elements = (elementtype *)malloc( sizeof(elementtype) * ( maxelements + 1 ) );
if ( h->elements == null )
h->capacity = maxelements;
h->size = 0;
h->elements[0] = mindate;
return h;
}void insert( elementtype x, priorityqueue h )
for ( i = ++h->size; h->elements[i/2] > x; i /= 2 )
h->elements[i] = h->elements[i/2];
h->elements[i] = x;
}elementtype deletemin( priorityqueue h )
minelement = h->elements[1];
lastelement = h->elements[h->size--];
for ( i = 1; i * 2 <= h->size; i = child )
h->elements[i] = lastelement;
return minelement;
}int isempty( priorityqueue h )
int isfull( priorityqueue h )
elementtype findmin( priorityqueue h )
return h->elements[1];
}void makeempty( priorityqueue h )
void destory( priorityqueue h )
else
}
資料結構 二叉堆
二叉堆 優先佇列 具有結構性和堆序性 結構性為 二叉堆是一棵完全被填滿的二叉樹,有可能的例外是在底層,底層上的元素從左到右填入。這樣的樹稱為完全二叉樹。二叉堆可以用陣列表示,對於陣列中任意位置i上的元素,其左兒子在位置2i上,右兒子在位置2i 1上,父親則在i 2上 小於i 2的最小整數 堆序性為 ...
資料結構 二叉堆
二叉堆其實就是二叉樹,只不過二叉堆的最頂端的值,要麼最大,要麼最小,這要根據題意來定。如圖 讀者注意一下,圖上的黑字代表二叉堆的值,而紅色則代表下表。二叉堆的基本操作 插入,刪除和查詢。堆的stl實現 本人不太懂,就參考這位大佬的 上圖中,q.top 就是查詢,q.pop 就是刪除,q.push 就...
資料結構之(二叉)堆
二叉 堆是乙個陣列,是一顆近似完全二叉樹,分為大頂堆 小頂堆。表示堆的陣列a有兩個屬性 1 a.length表示陣列元素的個數 2 a.heap size表示有多少個堆元素儲存在陣列a中。更多的關於堆的性質的介紹 演算法導論第三版 p85 p89 程式設計珠璣 p141 p145。堆的操作主要包括堆...