哈夫曼樹樹生成及編碼解碼

2021-09-29 15:45:38 字數 1706 閱讀 6493

哈夫曼編碼

time limit: 1000/2000 ms (c/others)   memory limit: 32768/32768 k (c/others)

problem description:

由若干個值無重複的結點及其權值,建立相應的哈夫曼樹。在合併過程中,若出現權值相同的情況,則優先選取編號小的進行合併;要求哈夫曼樹中所有左孩子編號小於右孩子編號(以結點的輸入順序做為其編號)。對所建的哈夫曼樹,根據左0右1的原則,對各結點進行編碼。設計乙個演算法,對給定的若干碼串進行相應的解碼,並輸出解碼結果。

input:

有多組測試資料,每組資料由結點資訊和碼串兩部分組成。結點資訊部分的第一行為乙個整數n(n<=20),表示以下有n個結點資訊,每個結點資訊包括乙個字元和乙個整數,表示結點值和權值;碼串部分的第一行為乙個整數m,表示以下有m個碼串(每個串長不超過100),碼串由0和1構成,且均有效。

output:

輸出各碼串對應的解碼結果,每個解碼結果佔一行,每組測試資料後有一空行。

sample input:4a7

g5o2d42

10110110111

11111010

sample output:

good

dog

#include

#include

#include

using

namespace std;

struct hf

;int i1,i2;

void

select

(hf huff,

int k)

}for

(int i=i1+

1;i)break;}

}// cout(int i=i1;i)else

if(huff[i]

.weight>=min&&huff[i]

.weightif(min==cmin)

}int

main()

for(

int i=

0;i<

2*n-

1;i++

)for

(int k=n;k<

2*n-

1;k++

)for

(int i=

0;i)else

if(huff[p]

.r==c)

c=p;

}// cout<}

cin>>m;

while

(m--)}

if(z==-1

)//因為是哈夫曼樹,每個葉子節點都是data的節點,所以每個data的編碼都一樣,

//不存在哪個data的編碼是另乙個data的字首,導致多種解碼情況。}}

cout<} cout<}return0;

}

測試資料:4a7

g5o2d42

10110110111

111110106a2

b3c5

d8e4f41

01010103b4

e2f3

4000

1101011

1110011

第一次寫的時候沒有對huff[i].b(huff[i]的編碼的逆序儲存)進行初始化,導致輸入不同的測試資料是出錯。我以為每次輸入n再建立huff陣列就不用對b進行初始化了。

生成樹和判斷等都可以寫成函式,但我的初始化和傳遞值有點麻煩

哈夫曼樹及哈夫曼編碼

哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...

哈夫曼樹及哈夫曼編碼

給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。樹節點間的邊相關的數叫做權。從樹中的乙個節點到另乙個節點之間的分支構成兩個點之間的路徑,路徑上的分支數目...

哈夫曼樹及哈夫曼編碼 C

說明 1.讀取檔案中需進行哈夫曼編碼的資料資訊 2.構造生成單節點二叉樹組 森林 3.構造哈夫曼樹 4.進行哈夫曼編碼 5.輸出對應資料及其編碼 include include includeusing namespace std const int max n 100 最大容量 const int...