葉結點帶權路徑長度最小的二叉樹
構造
給定n個權值分別為w1, w2, ...wn的結點,構造哈夫曼樹
- 將這n個結點分別作為n棵僅含一個結點的二叉樹,構成森林F
- 構造一個新結點,從F中選取兩棵根節(jié)點權值最小的樹,作為新結點的左右子樹,并將新結點的權值置為左右子樹上根結點的權值和
- 從F中刪除剛才選出的兩棵樹,同時將新的到的樹加入F
- 重復23直到F中只剩一棵樹
構造過程中,需經過n-1次合并,每次合并會新建一個節(jié)點,共新建了n-1個結點,結點總數(shù)為2n-1
用最小堆來構造一個哈夫曼樹
typedef struct TreeNode *HuffmanTree;
srtuct TreeNode
{
int Weight;
HuffmanTree Left, Right;
}
HuffmanTree Huffman(MinHeap H)
{
int i;
HuffmanTree T;
BuildMinHeap(H); //按權值調整為最小堆
for(i=1;i<H->Size;++i){
T=malloc(sizeof(struct TreeNode));
T->Left=DeleteMin(H);
T->Right=DeleteMin(H);
T->Weight=T->Left->Weight+T->Right->Weight;
Insert(H, T);
}
T=DeleteMin(H);
return T;
}
哈夫曼編碼
是一種可變長度編碼,對頻率高的字符賦予短編碼,頻率低的字符長編碼
前綴編碼:沒有一個編碼是另一個編碼的前綴