資料結構之二叉堆

2022-04-08 20:12:15 字數 4190 閱讀 2168

二叉堆的介紹

二叉堆是完全二元樹或者是近似完全二元樹,按照資料的排列方式可以分為兩種:最大堆和最小堆。

示意圖如下:

二叉堆一般都通過」陣列」來實現。陣列實現的二叉堆,父節點和子節點的位置存在一定的關係。有時候,我們將」二叉堆的第乙個元素」放在陣列索引0的位置,有時候放在1的位置。當然,它們的本質一樣(都是二叉堆),只是實現上稍微有一丁點區別。

假設」第乙個元素」在陣列中的索引為 0 的話,則父節點和子節點的位置關係如下:

(01) 索引為i的左孩子的索引是 (2*i+1);

(02) 索引為i的左孩子的索引是 (2*i+2);

(03) 索引為i的父結點的索引是 floor((i-1)/2);

以最大堆為例

template class maxheap;
新增假設在最大堆[90,80,70,60,40,30,20,10,50]種新增85,需要執行的步驟如下

如上圖所示,當向最大堆中新增資料時:先將資料加入到最大堆的最後,然後盡可能把這個元素往上挪,直到挪不動為止!

將85新增到[90,80,70,60,40,30,20,10,50]中後,最大堆變成了[90,85,70,60,80,30,20,10,50,40]。

/*

* 最大堆的向上調整演算法(從start開始向上直到0,調整堆)

* * 注:陣列實現的堆中,第n個節點的左孩子的索引值是(2n+1),右孩子的索引是(2n+2)。

* * 引數說明:

* start -- 被上調節點的起始位置(一般為陣列中最後乙個元素的索引)

*/template

void maxheap::filterup(int start)

}mheap[c] = tmp;

}/*

* 將data插入到二叉堆中

* * 返回值:

* 0,表示成功

* -1,表示失敗

*/template

int maxheap::insert(t data)

刪除假設從最大堆[90,85,70,60,80,30,20,10,50,40]中刪除90,需要執行的步驟如下:

* 最大堆的向下調整演算法

* * 注:陣列實現的堆中,第n個節點的左孩子的索引值是(2n+1),右孩子的索引是(2n+2)。

* * 引數說明:

* start -- 被下調節點的起始位置(一般為0,表示從第1個開始)

* end -- 截至範圍(一般為陣列中最後乙個元素的索引)

*/template

void maxheap::filterdown(int start, int end)

}

mheap[c] = tmp;}/*

* 刪除最大堆中的data

* * 返回值:

* 0,成功

* -1,失敗

*/template

int maxheap::remove(t data)

二叉堆的c++實現(完整原始碼)

/**

* 二叉堆(最大堆)

* * @author skywang

* @date 2014/03/07

*/#include

#include

using

namespace

std;

template

class maxheap;

/* * 建構函式

*/template

maxheap::maxheap()

template

maxheap::maxheap(int capacity)

/* * 析構函式

*/template

maxheap::~maxheap()

/* * 返回data在二叉堆中的索引

* * 返回值:

* 存在 -- 返回data在陣列中的索引

* 不存在 -- -1

*/template

int maxheap::getindex(t data)

/* * 最大堆的向下調整演算法

* * 注:陣列實現的堆中,第n個節點的左孩子的索引值是(2n+1),右孩子的索引是(2n+2)。

* * 引數說明:

* start -- 被下調節點的起始位置(一般為0,表示從第1個開始)

* end -- 截至範圍(一般為陣列中最後乙個元素的索引)

*/template

void maxheap::filterdown(int start, int end)

}

mheap[c] = tmp;}/*

* 刪除最大堆中的data

* * 返回值:

* 0,成功

* -1,失敗

*/template

int maxheap::remove(t data)

/* * 最大堆的向上調整演算法(從start開始向上直到0,調整堆)

* * 注:陣列實現的堆中,第n個節點的左孩子的索引值是(2n+1),右孩子的索引是(2n+2)。

* * 引數說明:

* start -- 被上調節點的起始位置(一般為陣列中最後乙個元素的索引)

*/template

void maxheap::filterup(int start)

}mheap[c] = tmp;

}/*

* 將data插入到二叉堆中

* * 返回值:

* 0,表示成功

* -1,表示失敗

*/template

int maxheap::insert(t data)

/* * 列印二叉堆

* * 返回值:

* 0,表示成功

* -1,表示失敗

*/template

void maxheap::print()

int main()

; int i, len=(sizeof(a)) / (sizeof(a[0])) ;

maxheap* tree=new maxheap();

cout

<< "== 依次新增: ";

for(i=0; icout

<< a[i] <

tree->insert(a[i]);

}cout

<< "\n== 最 大 堆: ";

tree->print();

i=85;

tree->insert(i);

cout

<< "\n== 新增元素: "

<< i;

cout

<< "\n== 最 大 堆: ";

tree->print();

i=90;

tree->remove(i);

cout

<< "\n== 刪除元素: "

<< i;

cout

<< "\n== 最 大 堆: ";

tree->print();

cout

<< endl;

system("pause");

return

0;}

效果如下

資料結構之(二叉)堆

二叉 堆是乙個陣列,是一顆近似完全二叉樹,分為大頂堆 小頂堆。表示堆的陣列a有兩個屬性 1 a.length表示陣列元素的個數 2 a.heap size表示有多少個堆元素儲存在陣列a中。更多的關於堆的性質的介紹 演算法導論第三版 p85 p89 程式設計珠璣 p141 p145。堆的操作主要包括堆...

基礎資料結構之二叉堆

二叉堆一般用於涉及插入 刪除 查詢最值得題目。往往配合其它題型使用。對頂堆 對頂堆常用於動態維護的問題。動態中位數 動態求解前i個數的中位數。黑盒子 動態求解前u i 個數第i大的數。超市 貪心題目。需要用到二叉堆的查詢最值 插入和刪除功能。序列 多路歸併問題。注意到是求和問題,題目讓求m個序列 合...

資料結構 二叉堆

二叉堆一般用來實現優先佇列 優先佇列是一種至少允許以下兩種操作的資料結構 insert 以及 deletemin 同查詢樹一樣,二叉堆具有結構性與堆序性,對二叉堆的基本操作可能會破壞這些性質,所以二叉堆的操作要直到其基本性質滿足才能結束。一 結構性 二叉堆在結構上為完全二叉樹,其具有完全二叉樹的結構...