二叉堆相關整理(大根堆小根堆)

2021-10-02 13:07:58 字數 1380 閱讀 7869

二叉堆是一種支援插入、刪除、查詢最值的陣列結構。它其實是一棵滿足堆性質的完全二叉樹,樹上的每乙個節點都帶有乙個權值。

層次序列儲存方式,直接用乙個陣列來儲存二叉堆。

逐層從左到右為樹中的節點依次編號,把此編號作為節點在陣列中儲存的位置(下標)。在這種儲存方式中,父節點編號等於子節點等於子節點編號除以2,左子節點編號等於父節點編號乘2,右子節點編號等於父節點編號乘2加1。

當然小根堆也一樣

1.insert

insert(val)操作向堆中插入乙個帶有權值val的新節點。我們把這個新節點直接放在儲存二叉堆的陣列末尾,然後通過交換的方式向上調整,直至滿足堆性質。其時間複雜度為堆的深度,即o(logn)

const

int size=

1e5+7;

int heap[size]

,n;voidup(

int p)

else}}

void

insert

(int val)

2.gettop

gettop操作返回二叉堆的堆頂權值,及最大值heap[1],複雜度為o(1)

int

gettop()

3.extract

extract操作把堆頂從二叉堆中移除。我們堆頂heap[1]與儲存在陣列為末尾的節點heap[n]交換,然後移除陣列末尾節點(令n減小1),最後把堆頂通過交換的方式向下調整,直至滿足堆性質。其時間複雜度為堆的深度,即o(logn)

void

down

(int p)

else

break;}

}void

extract()

4.remove

remove§操作把儲存陣列下標p位置的節點從二叉堆中刪除。先交換heap[p]與heap[n],然後令n減小1。heap[p]既有可能向下調整,也有可能向上調整,需要分別進行檢查和處理。時間複雜度為o(logn)

void

remove()

c++stl中的優先佇列priority_queue為實現了乙個大根堆,支援push(insert),top(gettop),pop(extract)操作,不支援remove操作。

我懶 所以一般用優先佇列

大概就是這些了,再想到我會補充。

堆(大根堆 小根堆)

堆又可稱之為完全二叉堆。這是乙個邏輯上基於完全二叉樹 物理上一般基於線性資料結構 如陣列 向量 鍊錶等 的一種資料結構。學習過完全二叉樹的同學們都應該了解,完全二叉樹在物理上可以用線性資料結構進行表示 或者儲存 例如陣列int a 5 就可以用來描述乙個擁有5個結點的完全二叉樹。那麼基於完全二叉樹的...

堆(Heap)大根堆 小根堆

具有以下的特點 1 完全二叉樹 2 heap中儲存的值是偏序 min heap 父節點的值小於或等於子節點的值 max heap 父節點的值大於或等於子節點的值 一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為...

堆(Heap)大根堆 小根堆

目錄一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為1和2。插入乙個元素 新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...