哈夫曼樹與哈夫曼編碼(C 實現)

2021-10-06 05:14:41 字數 1803 閱讀 5424

1、**對給定的n個權值構成n棵二叉樹的初始集合f=,其中每棵二叉樹ti中只有乙個權值為wi的根結點,它的左右子樹均為空。

2、在f中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。

3、從f中刪除這兩棵樹,並把這棵新的二叉樹同樣以公升序排列加入到集合f中。

4、重複2)和3),直到集合f中只有一棵二叉樹為止。

一、對給定的n個權值構成n棵二叉樹的初始集合f= ,其中每棵二叉樹ti中只有乙個權值為wi的根結點,它的左右子樹均為空。(為方便在計算機上實現算 法,一般還要求以ti的權值wi的公升序排列。)

二、在f中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。

三、從f中刪除這兩棵樹,並把這棵新的二叉樹同樣以公升序排列加入到集合f中。

四、重複二和三兩步,直到集合f中只有一棵二叉樹為止。

#include

#include

using

namespace std ;

class

huffmantreenode

;void huffmantreenode::

huffmantree

(huffmantreenode tree,

int w,

int n)

//初始化前n個結點的權值

for(

int i=

0;i)//開始構建哈夫曼樹

for(

int k = n ; k<

2*n-

1;k++)}

void huffmantreenode::

select

(huffmantreenode tree,

int k,

int&i1,

int&i2)

temp =

1000

;for

(int i =

0;i}void huffmantreenode::

huffmancode

(huffmantreenode tree[

], string huffmancode,

int n)}}

intmain()

huffmantreenode *tree =

new huffmantreenode[

2*count-1]

; string huffmancode[4]

; tree-

>

huffmantree

(tree,w,count)

; cout<<

"weight\t\tparent\t\tleft\t\tright"

int i =

0;i<

2*count-

1;i++

) cout<.weight<<

"\t\t"

<.parent<<

"\t\t"

<.left<<

"\t\t"

<.right

"哈夫曼編碼為:"

>

huffmancode

(tree,huffmancode,count)

;for

(int i=

0;i) cout<<<

" ";

cout

}

哈夫曼樹與哈夫曼編碼

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

哈夫曼樹與哈夫曼編碼

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

哈夫曼樹與哈夫曼編碼

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