C 小根堆 插入 刪除 初始化

2021-10-10 20:31:32 字數 1715 閱讀 4162

小根堆的性質:是完全二叉樹,根節點的關鍵字小於等於兩個子節點的關鍵字。

插入和刪除操作都應當保證小根堆的性質不變。

由於小根堆是完全二叉樹,所以使用陣列存放具有顯著優勢:按照層次遍歷將具有n個元素的小根堆的存放到陣列(命名為heap)的[1]~[n]項中。此時對於任一元素heap[i],其父節點為heap[i/2],其子節點為heap[i * 2] 和 heap[i*2+1]。

1、插入元素:從新的葉節點開始,向上考察其父節點,若父節點的關鍵字大於新節點的關鍵字,則二者交換位置,然後繼續向上考察;否則迴圈停止,插入位置確定。

2、刪除根節點(刪除最小節點):首先刪除heap[1],然後考察最後乙個葉節點能否填入空位(保證填入後依然是小根堆),如果能,則將該葉節點填入空位;如果不能,則將空位的兩個子節點中較小的乙個填入空位,然後對新的空位進行同樣的的操作。

3、將陣列堆化:從最後乙個有子節點的節點(由完全二叉樹的性質可知,該節點在陣列中的下標是節點個數長度/2)開始向前考察,對於考察到的每個節點,比較該節點的關鍵字與其較小子節點的關鍵字,若該節點的關鍵字更大,則二者交換位置,然後繼續比較該節點的關鍵字與新位置上較小子節點的關鍵字,直到該節點位置確定。

template

<

class

t>

class

mintree

//小根堆類

mintree

(t* theheap,

int thesize,

int thelength)

//利用已知陣列建立小根堆

heap[child /2]

= rootelement;}}

t front()

//獲取堆中首項,即最小值

bool

empty()

void

push

(const t& theelement)

//插入元素

heapsize++

;int currentnode = heapsize;

//新節點是最後乙個節點

while

(currentnode !=

1&& heap[currentnode /2]

> theelement)

//從新節點開始向上考察其父節點,若父節點比當前節點大,則交換位置

heap[currentnode]

= theelement;

}void

pop(

)//刪除最小元素,即刪除heap[1]

heap[1]

.~t(

);//重建小根堆,由於需要保持完全二叉樹的性質,所以在盡可能呼叫堆的最後乙個節點來補足空位

t lastelement = heap[heapsize]

; heapsize--

;int currentnode =1;

//此時該位為空,需要由最後乙個節點或子節點來補足

int child =2;

while

(child <= heapsize)

heap[currentnode]

= lastelement;

}private

: t* heap;

//堆中元素存放在陣列中

int arraylength;

//陣列容量

int heapsize;

//堆中元素個數

};

順序表的初始化 刪除 插入

初始化線性表 include include include define list init size 100 define listincrement 10 define ok 1 define error 0 define overflow 2 struct sqlist char elem ...

順序表的初始化 插入 刪除

昨天晚上做了中移動蘇州軟體公司的暑期實習崗的筆試題,感覺備受打擊,尤其是自以為是的資料結構題 從快排 歸併排序 堆排序中選一種實現 碎決定再次學習資料結構一次,並將重要的資料結構用程式實現。這裡先實現的是順序表的初始化,插入和刪除操作。include using namespace std 線性表的...

C 大根堆與小根堆

c 中,大根堆和小根堆可以使用優先佇列實現。include priority queuepq1 大根堆 priority queue,greater pq2 小根堆該stl支援自定義比較函式,但與sort不同,不支援直接使用lambda函式。自定義的小根堆如下。struct cmp 自定義小根堆 p...