堆的基本操作 手寫模擬堆

2022-01-19 10:16:20 字數 1435 閱讀 9519

解析:

這個題比較麻煩的一點就是k。第k個插入的數,不是樹里的序號。經過一系列變換後,第k個插入的數在樹里的序號會發生交換。

所以引入兩個陣列:ph[i]=x:表示第i次插入的數,在樹中的序號為x。hp[i]=x:表示樹中的序號i,是第x次插入的數。

乍一看,hp似乎並沒有什麼用,每次交換h和ph即可了。別急,請看下面:

我們來定義乙個全新的交換方式:heap_swap(int u,int v)

u,v做為樹的兩個結點號被傳了進來。

那麼我們需要交換h[u],h[v],我們要交換兩個ph,但是,ph裡的索引不知道,也就是說我們並不知道h[u],h[v]代表的數,是第幾次插入的,自然就沒法交換ph。

這個時候就可以看出hp的厲害了,hp[u],hp[v]不就是表示第幾次插入的數嗎?也就是ph的索引,至此,就可以交換ph了。有**:

void heap_swap(int u,int

v)

可以發現,順序對結果是沒有影響的~這個是本題的乙個難點,其他的就是模板了,看注釋吧:

#include#include

#include

using

namespace

std;

#include

typedef

long

long

ll;const

int maxn=1e5+10

;const

int maxn2=3e6+10

; int

hp[maxn],ph[maxn],h[maxn],n,m,siz;

void heap_swap(int a,int

b)void down(intu)}

void up(intu)}

intmain()

else

if(op[0]=='p'

)

else

if(op[0]=='

d'&&op[1]=='m'

)//刪除最小

else

if(op[0]=='d'

)

else}}

堆的基本操作

堆的基本概念 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i 2 ki k2 i 1 且 ki k2 i 2 i 0,1,2 則稱為小堆 或大堆 如下圖 分別為小堆和大堆 堆的操作具體 如下 測試環境 vs201...

堆的基本操作

堆的資料結構 對於堆,有最大堆和最小堆,在定義乙個堆的時候用乙個陣列表示堆,同時為了方便定義堆的大小,用乙個 size 表示堆的有效元素,同時為了區別最大堆和最小堆,我們用乙個函式指標表示這個堆是最大堆還是最小堆.typedef int compare heaptype parent,heaptyp...

堆的基本操作

heap.h ifndef heap h define heap h 定義乙個函式指標 typedef int pf hdatatype left,hdatatype right typedef int hdatatype typedef struct heap heap int greater h...