定義:
結點的帶權路徑長度為從該結點到樹根之間的路徑長度與結點上權的乘積。樹的帶權路徑長度為樹中所有葉子結點的帶權路徑長度之和。假設有n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi,則其中帶權路徑長度最小的二叉樹稱做最優二叉樹或赫夫曼樹。
構造赫夫曼樹的方法:
(1)根據給定的n個權值構成n棵二叉樹的集合f=,其中每棵二叉樹ti中只有乙個帶權為wi的根結點,其左右子樹均空。
(2)在f中選取兩棵根結點的權值最小的樹作為左右子樹構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為其左、右子樹上根結點的權值之和。
(3)在f中刪除這兩棵樹,同時將新得到的二叉樹加入f中。
(4)重複(2)和(3),直到f只含一棵樹為止。這棵樹便是赫夫曼樹。
**實現:
#include<
iostream
>
#include
<
assert.h
>
using
namespace
std;
struct
huffmannode
};void
select(
const
huffmannode*&
nodelist,
const
intlength,
int&
a, int&b)
}for
(intj=
0;j<
length;j++)
}}char
**huffmancoding(
const
int*
w, const
intn)
for(i
=n;i
<
m;i++
)char
temp [
20];
char
**code
=new
char
*[n];
for(i=0
;i<
n;i++
)temp[index]='
\0';code[i]
=new
char
[index+1
];strcpy(code[i],temp);
}delete nodelist;
return
code;
}int
main();//
編碼字元
intw[size]=;
//權重
char
**code;
code
=huffmancoding(w,size);
assert(code
!=null);
for(
inti=0
;i<
size;i++)
//注意二級指標的釋放問題
for(
intj=0
;j<
size;j++)
delete code;
return0;
}
赫夫曼樹編碼
本次分享輸入乙個字串輸出其赫夫曼樹編碼的 自己測試的時候沒有出現錯誤,希望大家幫我測試一下正誤,修改一下,謝謝啦!我的 的 雲共享 提取碼 2b2a include includeusing namespace std struct htnode 哈夫曼樹的結點結構 define maxsize 1...
解讀赫夫曼樹編碼的問題
定義 結點的帶權路徑長度為從該結點到樹根之間的路徑長度與結點上權的乘積。樹的帶權路徑長度為樹中所有葉子結點的帶權路徑長度之和。假設有n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi,則其中帶權路徑長度最小的二叉樹稱做最優二叉樹或赫夫曼樹。構造赫夫曼樹的方法 1 根據給定的n個權值構...
赫夫曼樹與赫夫曼編碼
問題描述 利用huffman編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳資料預先編碼,在接受端將傳來的資料編碼進行解碼 復原 對於有些通道,每端都需要乙個完整的編 解碼系統。試為這樣的資訊收發站編寫乙個huffman的編 解碼系統。給...