使用哈夫曼樹的演算法求電文字元編碼

2021-08-11 06:10:44 字數 1706 閱讀 2167

1.1.3二叉樹的應用

哈弗曼樹的基本概念

二叉樹的經典應用是哈夫曼樹(haffman)樹,也稱為最優二叉樹 ,是指對於一組帶有確定權值的葉結點,構造的具有最小帶權路徑長度的二叉樹。

構造:

假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1、w2、…、wn,則哈夫曼樹的構造規則為:

(1) 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有乙個結點);

(2) 在森林中選出兩個根結點的權值最小的樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;

(3)從森林中刪除選取的兩棵樹,並將新樹加入森林;

(4)重複(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹

哈夫曼編碼的實踐

public

class hfmtreenode

}

public

class hfmcodenode

}

/**

*@author劉勗

*@create2017-11-24-10:30

*/public

class

hfmtool ;

int weight=;

int n=ch.length;

hfmtreenode hfmtree=new hfmtreenode[2*n-1];

for(int i=0;i<2*n-1;i++) hfmtree[i]=new hfmtreenode();

//給節點權值

for(int i=0;i//獲得hfm編碼

hfmcodenode hfmcd=new hfmcodenode[n];

for(int i=0;inew hfmcodenode(n);

createhfmcode(hfmtree,hfmcd);

//輸出hfm編碼

system.out.println("霍夫曼編碼為:");

//輸出每個節點的哈夫曼編碼值

for(int i=0;i": ");

for(int j=hfmcd[i].start+1;j" ");

system.out.println();

} }

public

static

void

createhfmcode(hfmtreenode hfmtree,hfmcodenode cd)

cd[i].bit[cd[i].start]=0;

}else

if(hfmtree[p].rchild==c)

cd[i].start--;

c=p;//父結點為當前結點

哈夫曼樹的構造演算法,哈夫曼編碼演算法

include define max 100 define maxvalue 500 typedef struct int weight int parent,lchild,rchild node 哈夫曼樹結點型別 以下部分定義哈夫曼編碼儲存結構 typedef structcodetype typ...

電文的編碼和解碼(哈夫曼樹的應用)

一 實驗環境 學寶虛擬機器,vc6.0 二 實驗目的 從鍵盤接收一串電文字元,輸出對應的哈夫曼編碼,同時能翻譯哈夫曼編碼生成的 串,輸出對應的電文字元。三 實驗內容 1.用c語言實現二叉樹的鏈式 二叉鍊錶 儲存結構 2.實現二叉樹的基本操作的有關演算法 二叉樹的建立 各種遍歷等 3.定義二叉樹的靜態...

求哈夫曼樹的權值

哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出權值。5 1 2 2 ...