哈夫曼編碼長度及輸出

2021-10-11 18:30:34 字數 1493 閱讀 6149

最近又有小夥伴問我哈夫曼的輸出問題了,我想了一下,上次寫演算法只需要求頻率,偷懶的我求出頻率來就不管了,再三考慮還是再寫一下哈夫曼樹的輸出問題吧,畢竟寫個演算法要寫完整不是嗎?來吧走起!

#include

#include

using

namespace std;

#define max 100

typedef

struct

tree;

intquchong

(char

*p,int n,

char

*a);

intquchong

(char

*p,int n,

char

*a)if

(k==0)

}return l;

//返回新陣列的長度

}void

hfm_tree

(tree *hfm,

int*s,

int n)

for(i=

0;i)for

(i=0

;i1;i++

)else

if(hfm[j]

.quanzhi

.zuofu==-1

&&hfm[j]

.youfu==-1

)}hfm[n+i]

.quanzhi=hfm[x1]

.quanzhi+hfm[x2]

.quanzhi;

//權值等於兩顆子樹的和,並將左右子樹分別指定x1,x2

hfm[n+i]

.zuo=x1;

hfm[n+i]

.you=x2;

hfm[x1]

.zuofu=n+i;

hfm[x2]

.youfu=n+i;

//更新父親結點,不在加入上面的最小值比較 }}

intmain()

tree hfm[max]

;hfm_tree

(hfm,s,bl)

;//構造哈夫曼樹

for(i=

0;i)else}}

for(i=

0;i}for

(int i=

0;i)else

n++;}

sum+

=n*hfm[i]

.quanzhi;

//邊數*權值=最後編碼時此字元出現的次數

n=0;

} cout<

//這是長度

這裡我用的方法可能不是很標準,但是做出來不就行了,方法都是人想的,我和別人的不一樣才顯得突出對吧,這裡我自主的加上了乙個zuofu和youfu兩個成員,分別用來記錄這個結點時父親結點的左孩子還是右孩子。

這注釋是不是很全啊,我可是竟替你們著想了,還不給我來個三連~

哈夫曼樹及哈夫曼編碼

哈夫曼樹,最優二叉樹,帶權路徑長度 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...