什麼是堆?
堆是一種特殊的完全二叉樹(關於完全二叉樹可以參見隨筆《樹》)。
堆分為兩種:最大堆和最小堆
最大堆只需要滿足父節點大於兩個子節點,而子節點之間沒有要求。
最小堆只需要滿足父節點小於兩個子節點,而子節點之間沒有要求。
那麼,既然作為一棵完全二叉樹,每層中的節點應該是從左到右填滿的。
如果乙個節點沒有左兒子,那麼它一定也沒有右兒子。
並且在第n層中如果存在節點,肯定是由左向右依次排列,而且第n-1層必須是填滿的。
堆的實現
最小堆的實現**如下:
1 #include 2 #include 3 #include 4 #include 5 #include 6view codeusing
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 }
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 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...
資料結構 堆
堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...