帶權路徑長度最小的樹,常用於資料通訊中。
構造霍夫曼樹演算法:
設給定的一組權值為,據此生成森林f=,f 中的沒棵二叉樹只有乙個帶權為w1的根節點(i=1,2,……n)。在f中選取兩棵根節點的權值最小和次小的二叉樹作為左右構造一棵新的二叉樹,新二叉樹根節點的權值為其左、右子樹根節點的權值之和。
在f中刪除這兩棵最小和次小的二叉樹,同時將新生成的二叉樹併入森林中。
重複(2)(3)過程直到f中只有一棵二叉樹為止。
/*** huffman類
*/ class huffmantreenode;
typedef huffmantreenode * huffmantree; //宣告乙個huffmantreenode型別的huffmantree
huffmantree huffmancoding(char** &hc,int w,char a,int n); //huffman編碼
void select(huffmantree ht,int n,int&s1,int&s2);
void printhffmancode(char** &hc,int w,char code,int codelen,int a,int alen );
//選出兩個權值最小的節點
void select(huffmantree ht,int n,int&s1,int&s2)else
i=j+1;
while(i<=n)
int s1,s2;
for(;i<=m;++i)
hc=new char* [n];
cd=new char[n];
cd[n-1]='\0';
for(i=1;i<=n;++i)
hc[i-1]=new char[n-start];
strcpy(hc[i-1],&cd[start]);
} return ht;}
void printhffmancode(char** &hc,int w,char code,int codelen,int alen )
huffmancoding(codea,w,a,len);
printhffmancode(codea,w,a,len,len);
system("pause");
}
資料結構與演算法 霍夫曼樹 霍夫曼編碼和解碼
找出存放一串字元所需的最少的二進位制編碼。首先統計出每種字元出現的頻率,即 概率 權值。例如 頻率表 a 60,b 45,c 13 d 69 e 14 f 5 g 3 第一步 找出字元中頻率最小的兩個,小的在左邊,大的在右邊,組成二叉樹。在頻率表中刪除此次找到的兩個數,並加入此次最小兩個數的頻率和。...
資料結構之樹(五)霍夫曼編碼樹
1 概述 霍夫曼編碼是一種基於最小冗餘編碼的壓縮演算法。最小冗餘編碼是指,如果知道一組資料中符號出現的頻率,就可以用一種特殊的方式來表示符號從而減少資料需要的儲存空間。2 定義 霍夫曼樹 給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹...
資料結構 六 霍夫曼樹與編碼
1 演算法流程 1 構建霍夫曼樹 自底向上 根據統計頻率構建霍夫曼樹 a 把所有的節點扔進排序佇列queue 中 b 從queue 選擇選擇前面兩個最小的元素a b,把最小的樹 a作為左節點,把最小的 b作為右節點,以此構建父節點 c c的頻率值為 a b的頻率值 然後把a b從佇列刪除 把 c節點...