自己實現一下大根堆

2021-10-03 01:53:08 字數 1965 閱讀 2324

在一棵樹中,每個節點都大於(小於)它的左右孩子,這棵樹叫做大根樹(小根數)。乙個大根堆就是一棵大根樹,也是一棵完全二叉樹。

如圖所示大根樹,這個樹每個節點都大於它的子節點(除葉子節點以外)。

採用一維陣列儲存大根堆的每個節點最為方便。大根堆也是一棵完全二叉樹,使用陣列儲存效率也很高。上述大根堆儲存到陣列後,如下圖所示。

採用前序遍歷的方法儲存在陣列中。

定義**如下:

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...