資料結構 堆

2021-09-06 12:56:41 字數 2696 閱讀 5573

什麼是堆?

堆是一種特殊的完全二叉樹(關於完全二叉樹可以參見隨筆《樹》)。

堆分為兩種:最大堆和最小堆

最大堆只需要滿足父節點大於兩個子節點,而子節點之間沒有要求。

最小堆只需要滿足父節點小於兩個子節點,而子節點之間沒有要求。

那麼,既然作為一棵完全二叉樹,每層中的節點應該是從左到右填滿的。

如果乙個節點沒有左兒子,那麼它一定也沒有右兒子。

並且在第n層中如果存在節點,肯定是由左向右依次排列,而且第n-1層必須是填滿的。

堆的實現

最小堆的實現**如下:

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

78 template9

class

heap10;

15 template16

class

minheap17;

20 type *heap;

21int

cursize;

22int

maxsize;

23private:24

void filterdown(const

int pos,const

intend);

25void filterup(const

intstart);

26public

:27 minheap(int sz =defaultsize);

28 minheap(int ar, int

n);29 minheap(const minheap&mh);

30 minheap& operator=(const minheap&mh);

31 ~minheap();

32bool insert(const type &x);

33bool remove(type &x);

34bool isempty() const;35

bool isfull() const;36

void

makeempty();

37public

:38 template

39 friend ostream &operator

<

40};

4142 template43 minheap::minheap(int

sz)44

51 template52 minheap::minheap(int ar, int

n)53

61int pos = cursize/2;62

while (pos > 0)63

67}68 template69 minheap::minheap(const minheap&mh)

7077 template78 minheap& minheap::operator=(const minheap&mh)

7989

return *this;90

}91 template92 minheap::~minheap()

9399 cursize = maxsize = 0

;100

}101 template102

void minheap::filterdown(const

int pos, const

intend)

103112

if (heap[j] < heap[0]) //

父節點 大於 子女節點的最大者

113118

else

119122

}123 heap[i] = heap[0

];124

}125 template126

void minheap::filterup(const

intstart)

127138

else

139142

}143 heap[i] = heap[0

];144

}145 template146

bool minheap::insert(const type &x)

147154

155return

false

;156

}157 template158

bool minheap::remove(type &x)

159167

168return

false

;169

}170 template171

bool minheap::isempty() const

172175 template176

bool minheap::isfull() const

177180 template181

void minheap::makeempty()

182185 template186 ostream & operator

<

187194

out<

195return

out;

196 }

view code

good  good  study, day  day  up.

順序  選擇  迴圈  總結

資料結構 堆

最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...

資料結構 堆

資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...

資料結構 堆

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...