哈夫曼树又称最优树,是一类带权路径长度最短的树。其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树。
哈夫曼的构造算法:
(1):根据给定的n个权值{w1,w2,w3.....},构造n课只有根节点的二叉树,这n棵二叉树构成一个森林F
(2):在森林F中选取两棵根节点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根节点的权值为其左,右子树上根节点的权值之和
(3):在森林F中删除这两棵树,同时又将新得到的二叉树加入F中。
(4):重复(2)和(3),直到F只含一棵树为止,这棵树便是哈夫曼树。
哈夫曼算法的实现:
//------哈夫曼树的存储表示-------
typedef struct
{
unsigned int weight; //用来存储各个结点的权值
unsigned int parent,LChild,RChild; //指向双亲、孩子结点的指针
} HTNode, *HuffmanTree; //动态分配数组,存储哈夫曼树
typedef char *HuffmanCode; //动态分配数组,存储哈夫曼树
在构造哈夫曼树之前,还需要写出求最小权值的函数,代码如下:
///选择两个parent为0,且weight最小的结点s1和s2
void Select(HuffmanTree *ht,int n,int *s1,int *s2)
{
int i,min;
for(i=1; i<=n; i++)
{
if((*ht)[i].parent==0)
{
min=i;
break;
}
}
for(i=1; i<=n; i++)
{
if((*ht)[i].parent==0)
{
if((*ht)[i].weight<(*ht)[min].weight)
min=i;
}
}
*s1=min;
for(i=1; i<=n; i++)
{
if((*ht)[i].parent==0 && i!=(*s1))//除去刚才求得权值最小的,求下一个权值最小的
{
min=i;
break;
}
}
for(i=1; i<=n; i++)
{
if((*ht)[i].parent==0 && i!=(*s1))
{
if((*ht)[i].weight<(*ht)[min].weight)
min=i;
}
}
*s2=min;
}
算法,构造哈夫曼树: