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 ...