資料結構與演算法 01 二叉堆

2022-06-05 12:21:07 字數 2369 閱讀 5645

保證父節點優先順序始終高於子節點。

插入:判斷父子節點的優先順序

刪除:查詢:直接返回根節點的值

tip:根節點下標從1開始

#include #define max 1000000

using namespace std;

int heap[max + 10] = ;

int n, cnt=0; // cnt為堆中元素個數;

short op;

// 自下而上維護堆

void buttomup(int pos)

}// 自上而下維護堆

void updown(int pos)

// 右節點優先順序小於父,返回

else return;

} // 左節點的優先順序高於右節點

else

// 左節點優先順序小於父節點,返回

else return;

} }// 只有左節點

else if (2 * pos <= cnt)

// 左節點優先順序小於父節點,返回

else return;

} // 沒有節點,結束

else

}int main()

else if (op == 2)

else if (op == 3)

} }}

void swap(int a, int b)
void add(int k) 

else return;

}}

void del() 

else return;

} else

else return;

} }}

void get()
手寫堆費時易錯,可利用在c++的stl中的優先佇列。

#include
// 大根堆

priority_queueq_name;

// 小根堆

priority_queue,greater> q_name;

q.top()			//取得堆頂元素,並不會彈出

q.pop() //彈出堆頂元素

q.push() //往堆裡面插入乙個元素

q.empty() //查詢堆是否為空,為空則返回1否則返回0

q.size() //查詢堆內元素數量

給定乙個數列,初始為空,請支援下面三種操作:

給定乙個整數 xx,請將 xx 加入到數列中。

輸出數列中最小的數。

刪除數列中最小的數(如果有多個數最小,只刪除 11 個)。

第一行是乙個整數,表示操作的次數 nn。

接下來 nn 行,每行表示一次操作。每行首先有乙個整數 opo**p 表示操作型別。

對於每個操作 22,輸出一行乙個整數表示答案。

輸入 #1複製

5

1 21 523

2

輸出 #1複製

2

5

優化了io,將遞迴改為迴圈,使用了位運算(537ms / 3.16mb / 1.08kb)

#include #define max 1000000

int heap[max + 10] = ;

int n, cnt=0;

int op;

void swap(int a, int b)

void add(int k)

else return; }}

void del()

else return;

} else

else return;

} }}int main()

else if (op == 2)

else if (op == 3)

} return 0;

}

利用stl( 2.14s / 2.64mb / 452b )

#include #include using namespace std;

int n, op;

priority_queue,greater> q;

int main() else if (op == 2)else if (op == 3)

}return 0;

}

資料結構與演算法 二叉堆

核心操作是sift up,和sift down,其他所有操作都是建立在這兩個核心操作的基礎上的,事實上所有的堆結構都可以使用這兩個操作。const int maxsize 10001 int size 0 int min heap maxsize 0號單元不使用,因為如果使用0單元,則k 2無法找到...

資料結構與演算法 二叉堆

二叉堆本質上是一種完全的二叉樹,它分為兩個型別。1.最大堆 2.最小堆 什麼是最大堆?最大堆的任何乙個父節點的值,都大於或等於它左 右孩子節點的值。什麼是最小堆?最小堆的任何乙個父節點的值,都小於或等於它左 右孩子節點的值。二叉堆的根節點叫做堆頂。最大堆和最小堆的特點決定了 最大堆的堆頂是整個堆中的...

資料結構 二叉堆

二叉堆一般用來實現優先佇列 優先佇列是一種至少允許以下兩種操作的資料結構 insert 以及 deletemin 同查詢樹一樣,二叉堆具有結構性與堆序性,對二叉堆的基本操作可能會破壞這些性質,所以二叉堆的操作要直到其基本性質滿足才能結束。一 結構性 二叉堆在結構上為完全二叉樹,其具有完全二叉樹的結構...