哈夫曼树和哈夫曼编码c语言,[C++] 数据结构之哈夫曼树(最优满二叉树) / 哈夫曼编码...

一 哈夫曼树

1.1 基本概念

算法思想: 贪心算法(以局部最优,谋求全局最优)

定义

哈夫曼树 = 最优((满)二叉)树 = 带权路径最短的树

哈夫曼树所产生的哈夫曼编码 = (最优)前缀编码

1.2 算法描述/构造过程

1.3 算法实现

1> 定义存储结构

# define MAXNEGATIVE -9999 //最大负值

# define MAXPOSITIVE 9999 //最大正值

typedef struct HuffmanNode{ // 加 typedef : 避免发生编译错误 " variable or field 'functionName' declared void "

double weight;

int parent, lchild, rchild; //当前节点的双亲结点、左右孩子结点

}*HuffmanTree;

2> 确定最小的两个结点的选择策略(贪婪策略)【次核心】

/**

* 选择权值结点最小的两个结点 s1、s2

*/

void Select(HuffmanTree &HT,int k,int *s1,int *s2){

int min[2]={0, 0}; // 升序排名, 保留 HT中 权重值最小的两个结点的下标

cout<

HT[0].weight = MAXPOSITIVE; // 初始化为最大正值,方便被 初始结点比最小而比下去

for(int i=1;i<=k;i++){

// cout<

if( HT[i].parent==0 && (HT[i].weight

if(HT[i].weight

min[1] = min[0]; min[0] = i; cout<

} else {

min[1] = i;cout<

}

}

}

*s1 = min[0]; // 最小者下标

*s2 = min[1]; // 次小者下标

// cout<

}

3> 创建 Huffman 树【核心】

/**

* 创建 Huffman 树

* n : 初试结点(待编码结点)数

*/

void CreateHuffmanTree(HuffmanTree &HT, int n){

int m = 2*n-1;

HT = new HuffmanNode[m+1]; // 0 位空余

cout<

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

cin>>HT[i].weight;

}

for(int k=1;k<=m;k++){ // 初始化所有结点

HT[k].lchild = 0;

HT[k].rchild = 0;

HT[k].parent = 0;

}

for(int j=n+1;j<=m;j++){

int s1,s2;

Select(HT, j-1, &s1, &s2); // 选择权值结点最小的两个结点s1、s2

HT[s1].parent = j; // 合并左右结点

HT[s2].parent = j;

HT[j].lchild = s1;

HT[j].rchild = s2;

HT[j].weight = HT[s1].weight + HT[s2].weight;

}

}

4> 输出哈夫曼树(输出 哈夫曼树 中 结点情况 )

void OutputHuffmanTree(HuffmanTree &HT, int n){ // 输出 哈夫曼树 中 结点情况

int m = 2*n-1;

for(int i=1;i<=m;i++){

cout< weight: "<

cout<

cout<

}

}

5> 执行:Main函数

int main(){

HuffmanTree HT;

int n;

cout<

int s1, s2;

cin>>n;

CreateHuffmanTree(HT, n);

OutputHuffmanTree(HT, n);

return 0;

}

二 哈夫曼编码

三 哈夫曼译(解)码

四 参考文献

《数据结构(C语言版):严蔚敏/吴伟民》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值