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 ==