oj資料結構 Huffman樹

2021-10-11 01:31:31 字數 2417 閱讀 5840

對輸入的英文大寫字母進行統計概率 然後構建哈夫曼樹,輸出是按照概率降序排序輸出huffman編碼。

大寫字母個數 n

第乙個字母 第二個字母 第三個字母 … 第n個字母。

字母1 出現次數 huffman編碼

字母2 出現次數 huffman編碼

字母3 出現次數 huffman編碼

字母n 出現次數 huffman編碼

10i i u u u i u n u u

u 6 1

i 3 01

n 1 00

#include

#include

using

namespace std;

int a[

128]=;

template

<

typename e,

typename t>

struct huffmannode

huffmannode

(int p=-1

,int lc=-1

,int rc=-1

)};template

<

typename e,

typename t>

class

huffmancoder

public

:huffmancoder

(e* elems, t* weights,

int n)

//構建哈夫曼樹

int min1,min2;

int pos1,pos2;

for(

int i=n; i

)else

if(root[j]

.weight

root[i]

.lchild=pos1;

root[i]

.rchild=pos2;

root[i]

.weight=root[pos1]

.weight+root[pos2]

.weight;

root[pos1]

.parent=i;

root[pos2]

.parent=i;}}

~huffmancoder()

void

encoder

(int n)}}

void

outputcode()

}};bool

compare

(char ch1,

char ch2)

bool

compare_2

(int a,

int b)

intmain()

for(

int i=

65; i<=

90; i++)}

elems=

newchar

[sum]

; weights=

newint

[sum]

;for

(int i=

65; i<=

90; i++)}

sort

(elems,elems+sum,compare)

;sort

(weights,weights+sum,compare_2)

;//構建哈夫曼樹的陣列需要是排序過的,還需要與權對應

huffmancoder<

char

,int

>

coder

(elems, weights, sum)

; coder.

encoder

(sum)

;//給字母編碼

coder.

outputcode()

;return0;

}

huffmancoder

(e* elems, t* weights,

int n)

//構建哈夫曼樹

資料結構 Huffman樹

參照書上寫的huffman樹的 結構用的是線性儲存的結構 不是二叉鍊錶 裡面要用到查詢最小和第二小 理論上錦標賽法比較好 但是實現好麻煩啊 考慮到資料量不是很大 就直接用比較笨的先找最小 去掉最小再找第二小的方法了。include include include typedef struct htn...

資料結構 Huffman樹

參照書上寫的huffman樹的 結構用的是線性儲存的結構 不是二叉鍊錶 裡面要用到查詢最小和第二小 理論上錦標賽法比較好 但是實現好麻煩啊 考慮到資料量不是很大 就直接用比較笨的先找最小 去掉最小再找第二小的方法了。include include include typedef struct htn...

資料結構Huffman樹及編碼

一 實驗目的 構造乙個哈夫曼樹,並根據所構造的哈夫曼樹求其哈夫曼樹的編碼 二 基本思路 將每個英文本母依照出現頻率由小排到大,最小在左,組成乙個序列 每個字母都代表乙個終端節點 葉節點 比較每個字母的出現頻率,將最小的兩個字母頻率相加合成乙個新的節點,將兩個字母從序列中刪除,將生成的節點加入到字母佇...