二叉堆可以用來實現優先佇列。二叉堆是一棵完全二叉樹,除了葉子節點那一層,其他的層都是滿的,葉子節點那一層是從左往右依次存放的,因此它們的父子元素的索引有數學公式可以參考,對於節點i來說,它的左兒子是2i,右兒子是2i+1,它的父親節點是i/2向下取整,因此,在其內部我們可以通過陣列來實現元素的儲存,從而不需要鏈式結構,可以節約儲存空間,提高訪問速度(但是如果有合併操作,則會很慢,此時使用鏈式結構是不錯的選擇,可以採用左式堆或者斜堆以及二項佇列)。對於二叉堆來說,它具有堆序特性,及父節點小於(小頂堆)或者大於(大頂堆(stl中的優先佇列預設是大頂堆))兒子節點。
下面記錄一下今天的**:
首先是二叉堆的實現模板
#ifndef my_binary_heap_h
#define my_binary_heap_h
#include#includeusing namespace std;
/** 實現小頂堆
*/templateclass mybinaryheap
explicit mybinaryheap(const vector& items)
: array(items.size() + 10), currentsize(items.size())
buildheap();
} explicit mybinaryheap(const mybinaryheap& rhs)
: array(rhs.array), currentsize(rhs.currentsize){}
bool isempty()
const comparable & findmin() const
int getsize()
void insert(const comparable & x);
void deletemin();
void deletemin(comparable & minitem);
void makeempty()
private:
int currentsize; //存放當前heap中的元素
vectorarray; //陣列第乙個元素,即index == 0 的位置上沒有元素
//從index==1的位置開始放置元素,這樣方便對陣列下標和元素位置進行統一操作
void buildheap();
void percolatedown(int hole);
};/*
* 建立堆序
* 時間為o(n)
*/templatevoid mybinaryheap::buildheap()
/** 在二叉堆中插入乙個元素
* 首先在放在最後的位置上,然後不斷通過上濾(percolate up)演算法
* 一直找到比它小的節點,此時插入的元素成為這個節點的子樹
* 如果到達根部 hole==1,且根比它小,則它就成為根
* 插入的時間為 o(logn)
*/templatevoid mybinaryheap::insert(const comparable & x)
array[hole] = x;}/*
* 刪除最小項
* 如果本來二叉堆就是空的,執行刪除最小的元素這個操作時,在標準錯誤輸出上列印,並停機
*/templatevoid mybinaryheap::deletemin()
array[1] = array[currentsize--];
percolatedown(1);}/*
* 刪除最小項,並且把最小值放在minitem中
* 如果本來二叉堆就是空的,執行刪除最小的元素這個操作時,在標準錯誤輸出上列印,並停機
*/templatevoid mybinaryheap::deletemin(comparable & minitem)
minitem = array[1];
array[1] = array[currentsize--];
percolatedown(1);}/*
* 這個私有的方法主要用來實現下濾的演算法(percolate down)
* 引數hole指示了下濾開始的節點
* 平均時間o(logn)
*/templatevoid mybinaryheap::percolatedown(int hole)
array[hole] = tmp;
}#endif
然後是測試**:
#include"mybinaryheap.h"
#include#include#include#includeusing namespace std;
int main()
mybinaryheapbh2(tmpvec);//通過陣列來構造
cout << "此時有:" << bh1.getsize() <
cout << "測試拷貝建構函式:" << endl;
mybinaryheapbh3(bh1);//拷貝建構函式
cout << "==== 通過取最小值,獲得從小到大的排序 *****" << endl;
cout << "bh1:" << endl;
while (!bh1.isempty())
cout << endl;
cout << "bh2:" << endl;
while (!bh2.isempty())
cout << endl;
cout << "bh3:" << endl;
while (!bh3.isempty())
cout << endl;
return 0;
}
測試的結果為:
二叉堆的c 實現
在下小白乙個 如有錯誤請指正 上 using system using system.collections.generic 資料結構 namespace datastructure 刪除 刪除的key public void remove t key 銷毀 public void destory ...
二叉堆實現二
堆可以視為一棵完全二叉樹,樹的每一層都是被填滿的,最後一層可能除外,所以堆可以用陣列來表示。對於陣列中任意位置 i上的元素,其左兒子在位置 i 2 1 其右兒子在位置 i 2 2 上,其父節點在位置 i 1 2 1處。二叉堆有兩種 最大堆和最小堆。最大堆中,除根結點外 其無父結點 每個結點的關鍵字都...
二叉堆的實現 陣列) c
二叉堆的介紹 二叉堆是完全二元樹或者是近似完全二元樹,按照資料的排列方式可以分為兩種 最大堆和最小堆。最大堆 父結點的鍵值總是大於或等於任何乙個子節點的鍵值 最小堆 父結點的鍵值總是小於或等於任何乙個子節點的鍵值。示意圖如下 二叉堆一般都通過 陣列 來實現。陣列實現的二叉堆,父節點和子節點的位置存在...