每次刪除的一定都是堆頂的元素
具體步驟如下:
將堆頂的元素與堆中的最後乙個元素交換;
將堆中的有效元素減一;
對堆頂的元素進項向下調整。(因為第一步交換之後可能導致對不滿足大堆/小堆的性質)。
**示例:
//每次刪除的是堆頂的元素
intpoll()
private
void
shiftdown
(int parent)
//檢測較小的孩子是否比parent小
//if (array[child] < array[parent])
else}}
private
void
swap
(int parent,
int child)
堆的插入只需兩步:
先將元素放入到底層空間中(如果空間不足時,需要進行擴容,參照優先順序佇列的擴容方式進行擴容);
將最後新插入的元素進行向上調整,直到所有元素滿足堆的性質。
**示例:
//堆的插入
//boolean
offer
(int x)
array[size++
]= x;
shiftup
(size-1)
;return
true;}
//向上調整
private
void
shiftup
(int child)
else}}
//擴容--參考順序表
//只是模擬標準庫中優先順序佇列擴容的一部分
private
void
grow()
private
void
swap
(int parent,
int child)
堆的插入與刪除
首先宣告此堆為小堆。小堆與大堆 相似,原理相似 小堆的插入 在已經建成的最小堆的後面插入要插入的新元素,插入之後,當節點不滿足小堆的性質時,對對重新進行向下調整。關於為何用新元素插入最後,就我個人而言,是為了減少調整次數,畢竟若新元素放在後面恰巧滿足堆的性質就不需要調整,總體而言,調整次數減少 若將...
堆的建立 插入與刪除
堆使用完全二叉樹的結構進行儲存,根據完全二叉樹的性質,在堆中給定下標為i的節點時 如果i 0,節點i是根節點 否則節點i的父節點為節點 i 1 2 如果2i 1 n 1,則節點i無左子女 否則節點i的左子女為2i 1 如果2i 2 n 1,則節點i無右子女 否則節點i的右子女為2i 2 typede...
堆的建立,插入,刪除
堆的概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且ki k2 i 2 i 0,1,2 則稱這個堆為最小堆 或者最大堆 其實這麼多乾乾的概念還是很不好理解的 先來說一下什麼是完全二叉樹 如果一顆具有n個結點的二叉樹的結構與滿...