Huffman編碼演算法的實現

2021-08-27 16:12:25 字數 970 閱讀 4567

huffman樹中沒有度為1的節點。n0=n2+1;

1棵樹有n個葉子節點的huffman樹共有2n-1個節點,故可儲存在大小為2n-1的一位陣列中。

原因:求編碼需要從葉子節點出發走一條從葉子到根的路徑。

weight

parent

lchild

rchild

權值雙親節點下標左右

解碼需從根節點出發走一條到葉子結點的路徑。

typedef struct htnode

htnode;

//huffmand的生成

void create_huffman(unsigned n,htnode ht,unsigned m)/*輸入時,所有葉子結點都有權值*/

else

ht[k].weight=0;/*非葉子結點沒有權值*/

ht[k].parent=ht[k].lchild=ht[k].rchild=0;

}//初始化向量ht

for(k=n+1;k根據出現的頻度(權值)weight,對葉子節點的huffman編碼有兩種方式:

(1)從葉子節點到根逆向處理 ,求得每個葉子結點對於字元的huffman編碼。 

(2)從根節點開始遍歷整顆二叉樹,求得每個葉子 節點對應字元的huffman編碼。

由huffman樹生成知,n個葉子結點的樹共有2n-1個結點,葉子結點儲存在陣列ht中下標值為1-n.

(1)編碼是葉子結點的編碼,只需對陣列ht[1...n]的n個權值進行編碼。

(2)每個字元的編碼不同,但編碼的最大長度是n。 

求編碼時先設定乙個通用的字元的指標變數,求得編碼後再複製。

**:void huff_coding(unsigned n,hnode ht,unsigned m)

/*m應為n+1,編碼的最大長度n加1*/

free(cd);

}

Huffman編碼的實現

這裡的huffman編碼就是離散數學中學的最優二叉樹,現在我們用c 來實現它。首先考慮實現它使用的資料結構,當然這裡肯定使用二叉樹。其次就是儲存方式,對於樹一般情況是用間接儲存也就是鍊錶。但是二叉鍊錶不方便尋找雙親節點,這裡使用向量更好,對儲存空間的利用率也較高。建立資料結構 huffman樹中每個...

Huffman編碼的實現

include include define maxbit 100 定義哈夫曼編碼的最大長度 define maxvalue 100000 定義最大權值 define maxleaf 300 定義哈夫曼樹中最多葉子節點個數 define maxnode maxleaf 2 1 哈夫曼樹最多結點數 u...

Huffman編碼C 實現

huffman.h 葉子結點為n的哈夫曼樹共有2n 1個結點 ifndef huffman h define huffman h class huffmannode huffmannode const char data,const double wt,const int pa 1,const in...