哈夫曼树:假设有n个权值,试着造出一棵含有n个结点的二叉树,每个叶子结点带有权值,则其中带权路径长度最小的二叉树叫哈夫曼树。
1,哈夫曼树和哈夫曼编码的存储表示
在这一阶段我们需要命名两个动态数组,一个存储哈夫曼树,一个存储哈夫曼编码表
typedef struct huffNode
{
unsigned int weight; //权重
unsigned int lchild,rchild,parent; //左右子节点和父节点
}HTNode,*HuffTree;//动态分配数组存储哈夫曼树
typedef char **HuffCode;//动态分配数组存储哈夫曼编码表
2,选择函数的代码
在进行哈夫曼树创建过程中需要从叶子结点开始进行创建,所以首先需要选取权值最小的结点进行创建,则需要一个函数记录最小两个点的下标
void select(const HuffTree &HT,int n,int &s1,int &s2)
{
int i;
s1 = s2 = 0;
int min1 = 1000;//最小值,INT_MAX在<limits.h>中定义的
int min2 = 1000;//次小值
for ( i = 1; i <= n; ++i )
{
if ( HT[i].parent == 0 )
{//筛选没有父节点的最小和次小权值下标
if ( HT[i].weight < min1 )
{//如果比最小值小
min2 = min1;
s2 = s1;
min1 = HT[i].weight;
s1 = i;
}
else if ( (HT[i].weight >= min1) && (HT[i].weight < min2) )
{//如果大于等于最小值,且小于次小值
min2 = HT[i].weight;
s2 = i;
}
}
}
}
</