二叉堆的介紹
二叉堆是完全二元樹或者是近似完全二元樹,按照資料的排列方式可以分為兩種:最大堆和最小堆。
最大堆:父結點的鍵值總是大於或等於任何乙個子節點的鍵值;最小堆:父結點的鍵值總是小於或等於任何乙個子節點的鍵值。示意圖如下:
二叉堆一般都通過"陣列"來實現。陣列實現的二叉堆,父節點和子節點的位置存在一定的關係。有時候,我們將"二叉堆的第乙個元素"放在陣列索引0的位置,有時候放在1的位置。當然,它們的本質一樣(都是二叉堆),只是實現上稍微有一丁點區別。
假設"第乙個元素"在陣列中的索引為 0 的話,則父節點和子節點的位置關係如下:
(01) 索引為i的左孩子的索引是 (2*i+1);
(02) 索引為i的左孩子的索引是 (2*i+2);
(03) 索引為i的父結點的索引是 floor((i-1)/2);
假設"第乙個元素"在陣列中的索引為 1 的話,則父節點和子節點的位置關係如下:
(01) 索引為i的左孩子的索引是 (2*i);
(02) 索引為i的左孩子的索引是 (2*i+1);
(03) 索引為i的父結點的索引是 floor(i/2);
注意:本文二叉堆的實現統統都是採用"二叉堆第乙個元素在陣列索引為0"的方式!
二叉堆的**解析
**解析是以"最大堆"來進行介紹的
1. 基本定義
templatemaxheap是最大堆的對應的類。它包括的核心內容是"新增"和"刪除",理解這兩個演算法,二叉堆也就基本掌握了。下面對它們進行介紹。class
maxheap;
2. 新增
假設在最大堆[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]。
/*insert(data)的作用:將資料data新增到最大堆中。當堆已滿的時候,新增失敗;否則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)
3. 刪除
假設從最大堆[90,85,70,60,80,30,20,10,50,40]中刪除90,需要執行的步驟如下:
如上圖所示,當從最大堆中刪除資料時:先刪除該資料,然後用最大堆中最後乙個的元素插入這個空位;接著,把這個「空位」盡量往上挪,直到剩餘的資料變成乙個最大堆。
從[90,85,70,60,80,30,20,10,50,40]刪除90之後,最大堆變成了[85,80,70,60,40,30,20,10,50]。
注意:考慮從最大堆[90,85,70,60,80,30,20,10,50,40]中刪除60,執行的步驟不能單純的用它的字節點來替換;而必須考慮到"替換後的樹仍然要是最大堆"!
* 最大堆的向下調整演算法
* * 注:陣列實現的堆中,第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)
陣列實現二叉堆
二叉堆的定義 二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個...
模板 二叉堆 優先佇列的二叉堆陣列實現
最近開始學資料結構,一直無心更新部落格,今天結束集訓,晚上打算碼一下最近的進度。建立乙個最大容量為maxsize的int型堆 maxheapque maxsize 預設最大容量為1007 maxheapque 作為優先佇列 pop 同優先佇列pop 如果佇列已為空還要執行pop,就會執行死迴圈以報錯...
二叉堆的c 實現
在下小白乙個 如有錯誤請指正 上 using system using system.collections.generic 資料結構 namespace datastructure 刪除 刪除的key public void remove t key 銷毀 public void destory ...