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...