最大最小堆
1. 定義:
最小最大堆是一棵完全二叉樹,且其中每個元素有乙個key資料成員。樹的各層交替為最小層和最大層。根結點在最小層。設x是最小最大堆的任意結點。若x在最小(最大)層上,則x中的元素的key值在以x為根的子樹的所有元素中是最小(最大)的。位於最小(最大)層的結點稱為最小(最大)結點。
2. 特徵:
(1) 插入乙個具有任意key值的元素
(2) 刪除key值最大的元素
(3) 刪除key值最小的元素
3. 例如:
4. 插入10
template<classtype>
voidminmaxheap::insert(constelement&x )
n++;
intp = n/2;//p是新結點的雙親
if(!p)// 插入初始時為空的堆
switch(level(p))
elseverifymax(n, x);// 沿著最大層檢查
break;
casemax:
if(x.key > h[p].key)
elseverifymin(n, x);// 沿著最小層檢查
}//switch結束
}// insert結束
函式level確定乙個結點是位於最小最大堆的最小層,還是位於最大層。當élog2(j + 1)ù為偶數時,結點j位於最大層,否則位於最小層
函式verifymax從最大結點i開始,沿著從結點i到最小最大堆的根的路徑檢查最大結點,查詢插入元素x的正確結點。在查詢過程中,key值小於x.key的元素被移到下乙個最大層
函式verifymin與verifymax類似,所不同的是,前者從最小結點i開始,沿著從結點i到根的路徑檢查最小結點,將元素x插入正確位置。
分析:由於n個元素的最小最大堆有o(logn)層,成員函式insert的時間複雜性是o(logn)。
template<classtype>
voidminmaxheap::verifymax(inti,constelement&x )
h[i] = x;// 將x插入結點i
}
5. 刪除最小節點
一般而言,將元素x插入根結點為空的最小最大堆h中有兩種情況需要考慮:
(1) 根結點無子女,這時可將x插入根結點中。
(2) 根結點至少有乙個子女。這時堆中的最小元素(不算元素x)位於根結點的子女結點或孫子女結點(最多6個)之一。
假設該結點的編號為k,則還需要考慮下列可能性:
(a) x.key≤h[k].key。由於h中不存在比x更小的元素,所以x可插入根。
(b) x.key > h[k].key且k是根的子女。由於k是最大結點,其後代的key值都不大於h[k].key,因而也不大於x.key。所以可將元素h[k]移到根,並將元素x插入結點k。
(c) x.key > h[k].key且k是根的孫子女。這時也可將元素h[k]移到根。設p是k的雙親。若x.key> h[p].key,則將x 和h[p]交換。這時,問題轉化為將x插入以k為根的子堆中,且h[k]已騰空。這與初始插入根結點為空的最小最大堆h的情形類似。
template<classtype>
element*minmaxheap:: deletemin(element&y)
y = h[1];// 儲存根元素
elementx = h[n--];
inti = 1, j = n/2;// 為重新插入x作初始化,尋找插入x的位置
while(i <= j)
else
}//if(k<=2*i+1)結束
i = k;
}//if(x.key<=h[k].key)結束
}//while結束
h[i] = x;// 注意,即使現在n == 0,對h[1] 賦值也沒錯,這樣簡化邊界判斷
return&y;
}
其中又用到私有成員函式minchildgrandchild(i),該函式返回結點i的子女結點或孫子女結點中含最小元素的結點。
如果i的子女結點或孫子女結點都含最小元素,則minchildgrandchild返回子女結點,這樣可以避免deletemin中while迴圈的進一步迭代。
分析:while迴圈的每次迭代需o(1)時間,且每經過一次迭代(可能除了最後一次以外),i都下移兩層。由於n個元素的最小最大堆有o(logn)層,deletemin的時間複雜性是o(logn)。
最大堆 最小堆
堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...
最大堆 最小堆
堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...
最大堆 最小堆
堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...