数据结构 Huffman树(霍夫曼树、哈夫曼树)

Huffman树给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。结构定义:template<typename ElemType>struct HuffmanNode{ ElemType data; int weight; int num; int parent, lchild, rchild;};template<
摘要由CSDN通过智能技术生成

Huffman树

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

结构定义

template<typename ElemType>
struct HuffmanNode
{
   
	ElemType data;
	int weight;
	int num;
	int parent, lchild, rchild;
};

template<typename ElemType>
using HuffmanTree = HuffmanNode<ElemType>*;

template<typename ElemType>
struct HuffmanCode
{
   
	ElemType data;
	string code;
};

基本操作

初始化:创建节点数组,填入初始节点信息,其他节点信息初始化

template<typename ElemType>
void initHuffmanTree(HuffmanTree<ElemType>& HT, ElemType* data, int* weight, int len)//初始化HuffmanTree
{
   
	int len_HT = 2 * len - 1;//总长度
	HT = new HuffmanNode<ElemType>[len_HT];
	HuffmanTree<ElemType> p = HT;
	for (int i = 0; i < len; i++)//填入数据及权重
	{
   
		p->weight = weight[i];
		p->data = data[i];
		p++;
	}
	p = HT;
	for (int i = 0; i < len_HT; i++)//父子节点归0
	{
   
		p->num = i + 1;
		p->parent = 0;
		p->lchild = 0;
		p->rchild = 0;
		p++;
	}
}

创建:遍历所有未被选择的初始节点,寻找其中权重最小的两个节点创建结合成一颗树,直到只剩一个节点未被选择,剩下的这个结果就是Huffman树的根节点;选择未被选择的节点中权重最小的两个适合写成一个函数

寻找未被选择的节点中权重最小的两个:通过两次遍历可以寻找到权重最小的点,再来两次遍历就可以找到次小的节点;因为返回值需要两个,所有适合通过引用返回结果

template<typename ElemType>
void select(HuffmanTree<ElemType>& HT, HuffmanTree<ElemType>& min, HuffmanTree<ElemType>& sMin, int len)//选择权重最小的两项
{
   
	HuffmanTree<ElemType>p = HT, temp = HT;
	for (int i = 0; i < len; i++)//第一次遍历
	{
   
		if (p->parent == 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值