哈夫曼樹與哈夫曼編碼 c語言詳解

2021-10-01 07:51:30 字數 3179 閱讀 1264

本學期資料結構課程使用的教材為清華大學出版社的《 資料結構(c語言版)》,由於書中採用了很多偽碼,使得對c語言掌握不是很熟悉的同學有學習上的困難。所以二叉樹章節中,我嘗試編寫出更適合新手的哈夫曼編碼的c語言程式,一方面幫助像我一樣的新手,一方面也積累自己的經驗。

本人第一次寫部落格,如果有錯誤的地方,歡迎各位大佬指出。

typedef

struct

htnode;

//定義哈夫曼樹儲存結構

//構造具有n個結點的哈夫曼樹

void

createht

(htnode ht,

int n)

;int fnum=

;//待編碼字元出現的頻率

int i,k,lnode,rnode;

int min1,min2;

//設定葉子結點,將其儲存在陣列的前n位

for(i=

0;i)for

(i=0

;i<

2*n-

1;i++

)for

(i=n;i<

2*n-

1;i++

)else}}

}//設定雙親結點和權值

ht[rnode]

.parent=i;

ht[lnode]

.parent=i;

//最小和次小權重結點的雙親

ht[i]

.weight=ht[rnode]

.weight+ht[lnode]

.weight;

// 最小和次小權重結點雙親的權值

//設定雙親結點的lchild和rchild。位序小的放在左子樹上,位序大的放在右子樹上

if(lnode>rnode)

else

}}

//構造哈夫曼編碼hcd 

void

createhcode

(htnode ht[

], huffmancode hcd,

int n)

hcd[i]=(

char*)

malloc

((n-temp)

*sizeof

(char))

;//給第i個字元編碼分配空間

strcpy

(hcd[i]

,hc+temp+1)

;}}

//輸出哈夫曼編碼 

void

disphcode

(htnode ht[

], huffmancode hcd,

int n)

m+=ht[i]

.weight;

//計算碼長,求路徑長。

sum+

=ht[i]

.weight*j;

printf

("\n");

}printf

("\n平均長度=%g\n"

,1.0

*sum/m)

;}

int

main()

#include

#include

#include

#define n 50

//葉子結點數目的最大數

#define m 2*n-1

//樹中結點總數。完全二叉樹中n2=n0-1,n=n0+n2=2n0-1

typedef

struct

htnode;

//定義哈夫曼樹儲存結構

typedef

char

**huffmancode;

//定義哈夫曼編碼儲存結構

//構造具有n個結點的哈夫曼樹

void

createht

(htnode ht,

int n)

;//待編碼字元,這是乙個字串陣列

int fnum=

;//待編碼字元出現的頻率

int i,k,lnode,rnode;

int min1,min2;

for(i=

0;i)for

(i=0

;i<

2*n-

1;i++

)for

(i=n;i<

2*n-

1;i++

)else}}

}//設定雙親結點和權值

ht[rnode]

.parent=i;

ht[lnode]

.parent=i;

//最小和次小權重結點的雙親

ht[i]

.weight=ht[rnode]

.weight+ht[lnode]

.weight;

// 最小和次小權重結點雙親的權值

//設定雙親結點的lchild和rchild。位序小的放在左子樹上,位序大的放在右子樹上

if(lnode>rnode)

else}}

//構造哈夫曼編碼hcd

void

createhcode

(htnode ht[

], huffmancode hcd,

int n)

hcd[i]=(

char*)

malloc

((n-temp)

*sizeof

(char))

;//給第i個字元編碼分配空間

strcpy

(hcd[i]

,hc+temp+1)

;}}//輸出哈夫曼編碼

void

disphcode

(htnode ht[

], huffmancode hcd,

int n)

m+=ht[i]

.weight;

//計算碼長,求路徑長。

sum+

=ht[i]

.weight*j;

printf

("\n");

}printf

("\n平均長度=%g\n"

,1.0

*sum/m);}

intmain()

如有問題,可以與我聯絡。

哈夫曼樹與哈夫曼編碼

在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如 jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的...

哈夫曼樹與哈夫曼編碼

1.哈夫曼 huffman 編碼是哈夫曼樹的乙個應用。2.哈夫曼樹又稱為最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的相對值乘上其到根結點的路徑和權值。3.影象jpg就是利用了哈夫曼編碼。4.哈夫曼樹是最優二叉樹,子樹有左右次序之分。5.哈夫曼樹的形態不是唯...

哈夫曼樹與哈夫曼編碼

哈夫曼樹是一種簡單的樹結構,建樹過程如下 給出一組資料,不斷選擇最小的兩個數,並用兩個數的和作為它們的parent節點,再從資料中刪除這兩個數,將兩個數的和加入資料中,直到所有的資料都被加入樹結構,形成一顆樹。這顆樹的所有非葉子節點都有兩個child,兩個child的值的和則是這個節點的值,根節點是...