程式設計基礎22 優先佇列法構造哈弗曼樹

2021-08-28 06:35:13 字數 1327 閱讀 9816

1.規定哈弗曼樹的左子樹編碼為0,右子樹編碼為1;

2.若兩個字元權值相同,則ascii碼值小的字元為左孩子,大的為右孩子;

3.建立的新節點所代表的字元與它的做孩子的字元相同;

4.所有字元為ascii碼表上32-96之間的字元(即「 」到「`」之間的字元)。

輸入包含多組資料(不超過100組)

每組資料第一行乙個整數n,表示字元個數。接下來n行,每行有乙個字元ch和乙個整數weight,表示字元ch所對應的權值,中間用空格隔開。

輸入資料保證每組測試資料的字元不會重複。

對於每組測試資料,按照輸入順序輸出相應的字元以及它們的哈弗曼編碼結果,具體格式見樣例。

3

a 10

b 5c 8

4a 1

b 1c 1

d 1

a:0

b:10

c:11

a:00

b:01

c:10

d:11

一,思想

先構造出結構體的優先佇列,按照權值或ascii碼由小到大排列,然後構造哈夫曼樹,一直選取最小的兩個,pop掉,合併為乙個根,把這根再加入優先序列並確定好左右孩子和父親的關係,這裡的結構體陣列下標設定有講究,根的下標在根下標的後面,即一直n++,以便於後面按照結點順序排序,從而在dfs的時候通過序號與n的比較判斷什麼時候遍歷到根節點,即遍歷結束。

二,注意點

優先順序佇列如果插入的節點是結構體型別,則要在結構體中過載比較操作符函式。比較符號與實際相反,即如果從小到大排序應當是 return a.val>b.val.

三,**

#include#include#include#includeusing namespace std;

struct node

}tree[200];

int n;

char str[100];

bool cmp(node a, node b)

void dfs(int t, int q)

else

if (tree[t].left != -1) }}

int main()

n = n;

int t = 0;

while (s.size() > 1)

tree[t++] = s.top();

s.pop();

sort(tree, tree + t, cmp);

dfs(t - 1, 0);

for (int i = 0; i < n; i++)

}}

優先佇列的優先順序設定法

優先佇列也是用 include這個標頭檔案,且不必引入vector的標頭檔案 預設定義 手工設定 後面補充的兩個引數 既然預設是大頂堆,所以手動設定時只用管小頂堆即可,greater include include include using namespace std intmain 只可在結構體...

優先佇列基礎知識 四 二項佇列

本文主要分析二項佇列。這個優先佇列結構也是為了處理對數時間合併兩個優先佇列而提出來的。它可是保證平均插入時間為常數。同時合併,刪除最小元操作的最壞時間為o logn 這比左式堆更優,左式堆和斜堆是沒辦法實現平均插入時間是常數時間的。二項佇列是通過樹結構來實現的,我們在乙個樹節點中儲存關鍵字,它的右兄...

優先佇列的基礎知識

優先佇列概念 優先佇列是佇列的一種,不過它可以按照自定義的一種方式 資料的優先順序 來對佇列中的資料進行動態的排序每次的push和pop操作,佇列都會動態的調整,以達到我們預期的方式來儲存。例如 我們常用的操作就是對資料排序,優先佇列預設的是資料大的優先順序高所以我們無論按照什麼順序push一堆數,...