树-哈夫曼编码树 c++

哈夫曼树是一种最优二叉树,适用于数据压缩。通过选取权值最小的两棵树合并来构建,最小带权路径长度保证了效率。算法过程包括构造n个单节点树集合,不断合并最小权值树,直至只剩一棵树。哈夫曼编码通过左0右1的方式为每个字符生成唯一编码,避免前缀冲突。
摘要由CSDN通过智能技术生成

哈夫曼树也称为最优二叉树,其叶子结点带有权值,所有根结点到叶子结点的路径长度与该叶子结点的权值乘积之和被称为带权路径长度。对于一组确定权值的叶子结点,哈夫曼树是具有最小带权路径长度的二叉树。

哈夫曼算法:对于给定的n个权值构造n个只有根结点的二叉树,其集合为F;

选取F中根结点权值最小的两个两颗树分别作为左右子树合并为一颗新二叉树,其根结点权值为左右子树根结点之和;

将新树加入F,而合并前的两棵树从F中删除;

重复直到F中只有一棵树;

利用哈夫曼算法即可构造出哈夫曼编码树。哈夫曼编码树常用于压缩与解码,例如对于一组字符,其各个字母的使用频率作为权值,构造哈夫曼编码树,左树为0,右树为1,从根结点到叶子结点所构成的编码具有唯一性,其任意编码都不是其他编码的前缀。

struct element
{
	float weight;
	int lchild, rchild, parent;
	bool can_be_select;
	size_t pos_in_list;
};

struct char_list
{
	float weight;
	char c;
	size_t pos_in_huffman;
	string code;
};

void select(vector<element>& huffman, size_t& i1, size_t& i2)//从F中选择二叉树
{
	size_t k1=-1, k2=-1;
	for (vector<element&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值