哈夫曼樹的建立和編碼

2021-09-23 10:43:45 字數 995 閱讀 8053

演算法思路:

以權值分別為w1,w2...wn的n各結點,構成n棵二叉樹t1,t2,...tn並組成森林f=,其中每棵二叉樹 ti僅有乙個權值為 wi的根結點;

(2) 在f中選取兩棵根結點權值最小的樹作為左右子樹構造一棵新二叉樹,並且置新二叉樹根結點權值為左右子樹上根結點的權值之和(根結點的權值=左右孩子權值之和,葉結點的權值= wi)

(3) 從f中刪除這兩棵二叉樹,同時將新二叉樹加入到f中;

(4)重複(2)、(3)直到f中只含一棵二叉樹為止,這棵二叉樹就是huffman樹。

編碼原理:

對於給定的字符集d=及其頻率分布f=,用d1,d2,…,dn作為葉結點,w1,w2,…,wn作為結點的權,利用哈夫曼演算法構造一棵最優二叉樹,將樹中每個分支結點的左分支標上"0";右分支標上"1",把從根到每個葉子的路徑符號(「0"或"1」)連線起來,作為該葉子的編碼。

程式實現:

首先通過 huffmantree() 函式構造哈夫曼樹,然後在主函式 main()中, 自底向上開始(也就是從陣列序號為零的結點開始)向上層層判斷,若在父結點左側,則置碼為 0,若在右側,則置碼為 1,最後輸出生成的編碼。

#include #define maxbit      100

#define maxvalue 10000

#define maxleaf 30

#define maxnode maxleaf*2 -1

typedef struct

hcodetype;

typedef struct

hnodetype;

//構造一顆哈夫曼樹

哈夫曼樹建立和哈夫曼碼生成

直接上 htree.h typedef struct htreenode htreenode main.cpp include include include include htree.h htreenode inithtree int num 初始化哈夫曼樹結點 void getmin htre...

哈夫曼樹的建立以及哈夫曼編碼

主要源 如下 include include define max num 105 typedef struct htnode,htree void selecttwomin htree ht,int n,int s1,int s2 ht s1 visited 1 將最小的頻率對應的結點標記為已被訪...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....