最近又有小夥伴問我哈夫曼的輸出問題了,我想了一下,上次寫演算法只需要求頻率,偷懶的我求出頻率來就不管了,再三考慮還是再寫一下哈夫曼樹的輸出問題吧,畢竟寫個演算法要寫完整不是嗎?來吧走起!
#include
#include
using
namespace std;
#define max 100
typedef
struct
tree;
intquchong
(char
*p,int n,
char
*a);
intquchong
(char
*p,int n,
char
*a)if
(k==0)
}return l;
//返回新陣列的長度
}void
hfm_tree
(tree *hfm,
int*s,
int n)
for(i=
0;i)for
(i=0
;i1;i++
)else
if(hfm[j]
.quanzhi
.zuofu==-1
&&hfm[j]
.youfu==-1
)}hfm[n+i]
.quanzhi=hfm[x1]
.quanzhi+hfm[x2]
.quanzhi;
//權值等於兩顆子樹的和,並將左右子樹分別指定x1,x2
hfm[n+i]
.zuo=x1;
hfm[n+i]
.you=x2;
hfm[x1]
.zuofu=n+i;
hfm[x2]
.youfu=n+i;
//更新父親結點,不在加入上面的最小值比較 }}
intmain()
tree hfm[max]
;hfm_tree
(hfm,s,bl)
;//構造哈夫曼樹
for(i=
0;i)else}}
for(i=
0;i}for
(int i=
0;i)else
n++;}
sum+
=n*hfm[i]
.quanzhi;
//邊數*權值=最後編碼時此字元出現的次數
n=0;
} cout<
//這是長度
這裡我用的方法可能不是很標準,但是做出來不就行了,方法都是人想的,我和別人的不一樣才顯得突出對吧,這裡我自主的加上了乙個zuofu和youfu兩個成員,分別用來記錄這個結點時父親結點的左孩子還是右孩子。
這注釋是不是很全啊,我可是竟替你們著想了,還不給我來個三連~
哈夫曼樹及哈夫曼編碼
哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...
哈夫曼樹及哈夫曼編碼
給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。樹節點間的邊相關的數叫做權。從樹中的乙個節點到另乙個節點之間的分支構成兩個點之間的路徑,路徑上的分支數目...
哈夫曼樹及哈夫曼編碼 C
說明 1.讀取檔案中需進行哈夫曼編碼的資料資訊 2.構造生成單節點二叉樹組 森林 3.構造哈夫曼樹 4.進行哈夫曼編碼 5.輸出對應資料及其編碼 include include includeusing namespace std const int max n 100 最大容量 const int...