二叉堆的實現 陣列) c

2022-08-23 03:06:13 字數 2848 閱讀 1618

二叉堆的介紹

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

最大堆:父結點的鍵值總是大於或等於任何乙個子節點的鍵值;最小堆:父結點的鍵值總是小於或等於任何乙個子節點的鍵值。示意圖如下:

二叉堆一般都通過"陣列"來實現。陣列實現的二叉堆,父節點和子節點的位置存在一定的關係。有時候,我們將"二叉堆的第乙個元素"放在陣列索引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. 基本定義

template 

class

maxheap;

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]。

/*

* 最大堆的向上調整演算法(從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)

insert(data)的作用:將資料data新增到最大堆中。當堆已滿的時候,新增失敗;否則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 ...