二叉堆的實現

2021-09-07 05:42:02 字數 2599 閱讀 1136

二叉堆是一種特殊的堆,二叉堆是完全二元樹(二叉樹)或者是近似完全二元樹(二叉樹)。

二叉堆有兩種:最大堆和最小堆。

最大堆:父結點的鍵值總是大於或等於任何乙個子結點的鍵值;

最小堆:父結點的鍵值總是小於或等於任何乙個子節點的鍵值。

二叉堆一般都通過"陣列"來實現。陣列實現的二叉堆,父節點和子節點的位置存在一定的關係。我們將"二叉堆的第乙個元素"放在陣列索引0的位置。

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

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

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

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

二叉堆這種有序佇列如何入隊呢?

假設要在這個二叉堆裡入隊乙個單元,只要在陣列末尾加入這個元素,然後把這個元素往上挪,直到挪不動,經過了這種複雜度為ο(logn)的操作,二叉堆性質沒有變化。

那如何出隊呢?

我們習慣將二叉堆畫成樹的形式,但本質上還是用陣列實現的。

具體**如下:

1 #include 2 #include 3

using

namespace

std;

45 template 6

class

minheap7;

3132 template 33 minheap::minheap(vectordata)

3439}40

4142 template 43 minheap::minheap(int

capacity)

4448

49 template 50 minheap::minheap()

5154

5556 template 57 minheap::~minheap()

5862

63//

得到data的索引,-1表示未找到

64 template 65

int minheap::getindex(t data)

6672

return -1;73

}747576

/*77

* 最小堆的向下調整演算法78*

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

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

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

83*/

84 template 85

void minheap::filterdown(int start, int

end)

8697

if (tmp <=m_array[left])

98break;//

調整結束

99else

100105

}106 m_array[current] =tmp;

107}

108109

//刪除最小堆中的data

110 template 111

bool minheap::remove(t data)

112124

125//

向上調整

126 template 127

void minheap::filterup(int

start)

128142

}143 m_array[current] =tmp;

144}

145146

147 template 148

void minheap::insert(t data)

149154

155156 template 157

void minheap::print()

158163 }

測試:

1 #include "

binaryheap.h"2

3int

main()4;

7 minheapheap(vec);

8 cout << "

最小堆為:";

9heap.print();

10 cout << "

\n請輸入要新增的元素";

11 cin >>tmp;

12heap.insert(tmp);

13 cout << "

新增之後最小堆為:";

14heap.print();

15 cout << "

\n請輸入要刪除的元素:";

16 cin >>tmp;

17heap.remove(tmp);

18 cout << "

刪除之後最小堆為:";

二叉堆的實現

include include define max heap size 101 class binaryminheap void insert intvalue void removemin intgetmin void displayheaparray private int heaparray...

二叉堆的實現

1.堆的概念 這裡只需要注意兩點 a.堆的儲存方式 就是順序儲存在陣列中,在二叉樹中表現為滿二叉樹 b.堆的用處 用於排序,查詢最大最小都非常方便 2.堆的實現 heapexception.h ifndef heapexception h define heapexception h class a...

二叉堆實現二

堆可以視為一棵完全二叉樹,樹的每一層都是被填滿的,最後一層可能除外,所以堆可以用陣列來表示。對於陣列中任意位置 i上的元素,其左兒子在位置 i 2 1 其右兒子在位置 i 2 2 上,其父節點在位置 i 1 2 1處。二叉堆有兩種 最大堆和最小堆。最大堆中,除根結點外 其無父結點 每個結點的關鍵字都...