初步了解二叉堆(二叉堆及其基本操作)

2022-07-30 11:12:11 字數 2007 閱讀 2365

如圖,簡單來說,二叉堆是一棵滿足「堆性質」的完全二叉樹,樹上的每乙個節點都帶有乙個權值。

若樹中任意的乙個節點的權值都小於等於其父節點的權值,則稱滿足該性質的完全二叉樹大根堆(根權值最大)。

若樹中任意的乙個節點的權值都大於等於其父節點的權值,則稱滿足該性質的完全二叉樹小根堆(根權值最小)。

二叉樹是一種支援插入、刪除、查詢的資料結構。

在介紹二叉堆的基本操作之前,我們要先說說如何建堆。

根據完全二叉樹的性質,我們可以採用層次序列儲存方式,直接用乙個陣列來儲存二叉堆。我們讓父節點的編號等於子節點編號除以 2 ,左子節點編號等於父節點編號乘以 2 ,右子節點編號等於父節點編號乘以 2 加 1 。(如上圖所示)

接下來,我們以乙個大根堆為例,介紹一下二叉堆的基本操作

為了保證大根堆滿足它的性質,我們有 down 和 up 兩種操作。

down 是從某個節點從上往下維護,在某個節點中,如果它的左兒子或右兒子是三個節點中最大的,則應該讓最大的與父節點交換。

void down(int p)

else

break;

}}

up 同理,是從下向上維護

void down(int p)

int gettop()

即刪除堆頂,我們可以將堆頂和堆尾交換,後刪除堆尾,然後 down 操作

void extrat()

如果我們要刪除 k 元素,可以將它與堆尾交換,後刪除堆尾,然後進行 down 和 up兩個操作(因為被換到中間,向上向下調整都有可能)

void remove(int k)

void change(int k,int x)

原題

這題就運用到了上面四個基本操作,值得注意的是,我們開始應該如何建堆?我們可以對 n/2 到 1 的節點進行 down 操作(因為葉節點沒有子節點,就不用列舉了),也可以從 2 到 n 進行 up 操作,這樣我們可以在 o(n) 時間內維護乙個二叉堆。

時間複雜度的證明是乙個等差比數列的求和,這個和小於1,所以為 o(n)。

應注意的是,這題是維護乙個小根堆,所以上面操作應該有所修改。

**:

#includeusing namespace std;

int heap[100005],n,x,m,a[1000005];

void down(int p)

for(int i=n/2;i;i--)

while(m--)

return 0;

}

可以說優先佇列和二叉堆有著相同的性質,而在c++中由於priority_queue的存在,為我們上述的幾個操作提供了極大的便利,有現成的函式可以拿來使用,所以下面就來簡單介紹一下。

標頭檔案:#include

該stl語法除了大多數stl支援的 heap.size() , heap.empty() 之外,還有以下幾個

priority_queueheap;//預設為大根堆
如果想要實現乙個小根堆,有兩種方法:

priority_queue,greater>heap;//小根堆
heap.push(x);
heap.pop();
int x=heap.top();
注意:queue 沒有 heap.clear() 操

(二叉)堆操作

堆操作 實驗目的 一 建堆 將陣列a 1.n 變成乙個最大堆。二 堆排序 將乙個堆中的元素按遞減排序輸出。三 用插入方法建堆 堆大小從1到n每次插入乙個元素到堆中,直到n個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...

簡單 二叉堆

堆是一種比較有用的資料結構,是二叉樹的一種陣列的表示形式。最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最小堆是最大層和最小層交替出現的二叉樹,即最大層...

演算法 二叉堆

二叉堆具體來說就是支援插入刪除查詢最值的資料結構,是一棵滿足堆性質的完全二叉樹,樹上的每乙個節點對應乙個權值。若樹中的任意乙個節點的權值都小於其父節點的權值,則稱該二叉樹滿足大根堆性質,即我們常說的大根堆。若書中任意乙個節點的全職都打與其父親節點的權值,則稱該二叉樹滿足小根堆性質,即小根堆。二者統稱...