二叉堆(优先队列)

    技术2024-08-02  63

     

    二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值,且每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。

    当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。

     

     

    BinnaryHeap.h

    #ifndef BinaryHeap_h__ #define BinaryHeap_h__ #include <vector> using std::vector; // ******************公有操作********************* // void insert(x) --> 插入x // deleteMin(minItem) --> 删除最小值,并将删除的最小值赋予minItem(只是用于最小堆) // deleteMax(maxItem) --> 删除最大值,并将删除的最大值赋予maxItem(只是用于最大堆) // Comparable findMin() --> 返回最小值 // Comparable findMax() -->返回最大值 // bool isEmpty() --> 判空 // void makeEmpty() --> 删除所有元素 template <typename Comparable> class BinaryHeap { public: BinaryHeap(int capcity = 100, bool minheap = true) :CurrentSize(0), isMinHeap(minheap), array(capcity + 1) { } BinaryHeap(const vector<Comparable> & items, bool minheap = true) :isMinHeap(minheap), array(items.size() + 10 ), CurrentSize(items.size()) { for(int i=0; i<items.size(); i++) array[i + 1] = items[i]; buildHeap(); } void maxHeap_insert(const Comparable &x) { if(array.size() == CurrentSize - 1) array.resize(2 * array.size()); //下滤 int hole = ++CurrentSize; for(; hole > 1 && x > array[hole/2]; hole /= 2) array[hole] = array[hole/2]; array[hole] = x; } void minHeap_insert(const Comparable &x) { if(array.size() == CurrentSize - 1) array.resize(2 * array.size()); //下滤 int hole = ++CurrentSize; for(; hole > 1 && x < array[hole/2]; hole /= 2) array[hole] = array[hole/2]; array[hole] = x; } void deleleMin() { if(isEmpty() || !isMinHeap) return; array[1] = array[CurrentSize--]; percolateDown(1); } void deleleMin(Comparable &minItem) { if(isEmpty() || !isMinHeap) return; minItem = array[1]; array[1] = array[CurrentSize--]; percolateDown(1); } void deleteMax() { if(isEmpty() || isMinHeap) return; array[1] = array[CurrentSize--]; percolateDown(1); } void deleteMax(Comparable &maxItem) { if(isEmpty() || isMinHeap) return; maxItem = array[1]; array[1] = array[CurrentSize--]; percolateDown(1); } const Comparable & minHeap_findMin() const { if(isEmpty()) return; return array[1]; } const Comparable & maxHeap_findMax() const { if(isEmpty()) return; return array[1]; } bool isEmpty() const { return CurrentSize == 0; } void makeEmpty() { CurrentSize = 0; } private: bool isMinHeap; int CurrentSize; vector<Comparable> array; //建堆 void buildHeap() { for(int i=CurrentSize/2; i>0; i--) percolateDown(i); } //下滤hole void percolateDown(int hole) { int child; Comparable temp = array[hole]; //最小堆 if(isMinHeap) { for(; hole * 2 <= CurrentSize; hole = child) { child = hole * 2; if(child != CurrentSize && array[child + 1] < array[child]) child++; if(array[child] < temp) array[hole] = array[child]; else break; } } //最大堆 else { for(; hole * 2 <= CurrentSize; hole = child) { child = hole * 2; if(child != CurrentSize && array[child + 1] > array[child]) child++; if(array[child] > temp) array[hole] = array[child]; else break; } } array[hole] = temp; } }; #endif // BinaryHeap_h__ 

    测试代码:

    #include "BinaryHeap.h" #include <cstdlib> #include <ctime> #include <iostream> using namespace std; int main() { vector<int> v; srand((unsigned)time(0)); for(int i=0; i< 20; i++) { int t = rand(); cout<<t<<" "; v.push_back(t); } cout<<endl; BinaryHeap<int> heap(v, false); int x = 5; for(int i=0; i< 20; i++) { heap.deleteMax(x); cout<<x<<" "; } cout<<endl; getchar(); return 0; } 

    最新回复(0)