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

2021-05-23 17:04:41 字數 1618 閱讀 2111

#include

#define max 100

#define maxvalue 500

typedef  struct

int weight;

int parent,lchild,rchild;

}node; /*哈夫曼樹結點型別*/

/*-----------------------------以下部分定義哈夫曼編碼儲存結構-------------------------*/

typedef structcodetype;

typedef structelement;

void getminelementlocal(node t ,int num , int *minlocal1 , int *minlocal2) ;

/*構建哈夫曼樹。n為構建哈夫曼樹的葉子結點個數,陣列w儲存每個葉子的權值,陣列t儲存構建好的哈夫曼樹*/

void huffman(int n,int w,node t)

int m = 0 ;

int minlocal1 , minlocal2 ;

int i = 0 ;

node * nodes = null ;

if(n == 0) return ;

m = 2*n -1 ;

for(i = 1 ; i <= n ; i ++)

for(; i <= m ; i ++)

for(i = 1 ; i <= n-1 ; i ++)

void getminelementlocal(node t ,int num , int *minlocal1 , int *minlocal2)

}for(i = 1 ; i < num ; i ++)

}/*根據哈夫曼樹,求哈夫曼編碼表。tree儲存哈夫曼樹,table儲存哈夫曼編碼表,n為哈夫曼樹葉子個數*/

void sethufcode(node tree,element table,int n)

int i,j,s,f; /* 和f分別指示tree中孩子和雙親的位置*/

codetype c;/*時存放編碼 */

for(i=1;i<=n;i++)/*次求葉子tree[i]的編碼 */

for(j=c.start ;jprintf("%c",c.bits[j]);

printf("/n");

table[i].code=c;/*時編碼複製到最終位置 */  

} void main()

node t[100];

int i,n,w[100];

element m[100];

printf("請輸入結點數:");

scanf("%d",&n);

for(i=1;i<=n;i++)

/*構造哈夫曼樹*/

huffman(n ,w , t) ;

printf("序號 權重 雙親 左孩 右孩/n");  /*輸出哈夫曼樹*/

for(i=1;i<(2*n);i++)

printf("%-5d%-5d%-5d%-5d%-5d/n",i,t[i].weight,t[i].parent,t[i].lchild,t[i].rchild);

sethufcode(t,m,n); /*構造並輸出哈夫曼編碼表*/

構造哈夫曼樹 哈夫曼編碼

1.權值越大的節點,距離根越近 2.樹中沒有度為1的節點,這類樹叫正則 嚴格 二叉樹,樹的總節點 2 雙分支結點 1 單分支結點 雙分支結點 3.樹的帶權路勁 wpl 所有葉子結點的帶權長度路勁之和 長度最短。嗶哩嗶哩王卓老師的口訣 構造森林全是根,選用兩小選新樹,刪除兩小添新人,重複23剩單根 1...

哈夫曼樹構造 哈夫曼編碼

一 哈夫曼樹 p189 1.定義 帶權路徑長度 wpl 最小的二叉樹稱為哈夫曼樹 wpl 樹中所有葉子節點的帶權路徑長度之和 帶權路徑長度 從樹根到任意節點的路徑長度與該節點上權值的乘積 2.構造 1 將這n個節點分別作為n課僅含乙個結點的二叉樹,構成森林f 2 構造乙個新節點,從f中選取兩棵根節點...

哈夫曼編碼 哈夫曼樹

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