二叉堆的介紹
二叉堆是完全二元樹或者是近似完全二元樹,按照資料的排列方式可以分為兩種:最大堆和最小堆。
示意圖如下:
二叉堆一般都通過」陣列」來實現。陣列實現的二叉堆,父節點和子節點的位置存在一定的關係。有時候,我們將」二叉堆的第乙個元素」放在陣列索引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 同查詢樹一樣,二叉堆具有結構性與堆序性,對二叉堆的基本操作可能會破壞這些性質,所以二叉堆的操作要直到其基本性質滿足才能結束。一 結構性 二叉堆在結構上為完全二叉樹,其具有完全二叉樹的結構...