使用C 實現二叉堆

2021-07-25 15:24:24 字數 2880 閱讀 4794

二叉堆可以用來實現優先佇列。二叉堆是一棵完全二叉樹,除了葉子節點那一層,其他的層都是滿的,葉子節點那一層是從左往右依次存放的,因此它們的父子元素的索引有數學公式可以參考,對於節點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

二叉堆的介紹 二叉堆是完全二元樹或者是近似完全二元樹,按照資料的排列方式可以分為兩種 最大堆和最小堆。最大堆 父結點的鍵值總是大於或等於任何乙個子節點的鍵值 最小堆 父結點的鍵值總是小於或等於任何乙個子節點的鍵值。示意圖如下 二叉堆一般都通過 陣列 來實現。陣列實現的二叉堆,父節點和子節點的位置存在...