在一棵樹中,每個節點都大於(小於)它的左右孩子,這棵樹叫做大根樹(小根數)。乙個大根堆就是一棵大根樹,也是一棵完全二叉樹。
如圖所示大根樹,這個樹每個節點都大於它的子節點(除葉子節點以外)。
採用一維陣列儲存大根堆的每個節點最為方便。大根堆也是一棵完全二叉樹,使用陣列儲存效率也很高。上述大根堆儲存到陣列後,如下圖所示。
採用前序遍歷的方法儲存在陣列中。
定義**如下:
class
maxheap
;int
getsize()
const
;void
pop();
void
push
(const
int)
;void
print()
;private
:int
*heap;
//1維陣列
int heapsize;
//節點個數
int capacity;
//容量};
maxheap::
maxheap
(int cap)
3.1如果插入新節點:2
插入後,依然是大根堆,所以直接插入即可。
3.2 如果插入新節點:20
插入20後,因為9小於20,所以不符合大根堆。需要將節點9下移或將節點20上移,構成乙個新的大根堆。
插入**如下:
void maxheap::
push
(const
int newelement)
//插入到最末尾的葉子節點上
int node =
++heapsize;
//插入後,遍歷一遍檢查是否符合大根堆
//注:節點存放從陣列heap[1]開始存放
//這樣任意乙個非根節點的位置除以2,即為當前節點的根節點的位置
while
(node !=
1&& heap[node /2]
< newelement)
heap[node]
= newelement;
}
優先順序佇列priority-queue使用的是大根堆實現的。大根堆的刪除就是刪除根節點。
4.1 步驟
刪除根節點,將末尾的節點移動到根節點
遍歷樹,維護成大根堆
實現**如下:
void maxheap::
pop(
) heap[1]
= heap[heapsize]
; heap[heapsize--]=
0;int child =1;
for(
int i =
1; i *2+
1<= heapsize; i++
)}
void maxheap::
print()
intmain()
大根堆實現
堆 有兩種,一種是大根堆,另一種是小根堆。大根堆的意思是在跟的位置那個數是最大的。同理,小根堆的根元素是最小的。堆是乙個滿的二叉樹,除了最後乙個節點可能不是滿的。所以用陣列去陣列去實現它。乙個節點的index為i,則這個節點的兩個子節點的下標應該為2 i 1和2 i 2 父結點那就是 i 1 2 下...
C 實現大根堆
一 堆的定義 堆的物理儲存結構是一維陣列,邏輯儲存結構是完全二叉樹。堆的基本操作包括 insert 向堆中插入乙個元素,deletetop 刪除堆頂元素 上面的就是乙個大根堆,大根堆具有以下性質 每乙個節點的值都小於它父節點的值。我們也可以從上面的中看出來。但是需要注意的是,每乙個節點的值的大小與它...
python 手動實現大根堆
主要實現了四個函式 add 往堆裡加新的值,相當於在list末尾新增值,然後siftup維護大根堆從上到下從大到小 class maxheap object def init self,maxsize self.maxsize maxsize 堆的大小 self.elements 0 maxsize...