哈夫曼树的定义
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
哈夫曼树的性质
1.没有度为1的节点
2.对于同一组权值,存在不同构的哈夫曼树
3.n个叶子节点的哈夫曼树共有2*n-1个结点
哈夫曼树实现
struct ElemType
{
int weight;
int parent,lchild,rchild;
};
void HuffmanTree(ElemType huffman[],int w[],int n)
{
int i,k,i1,i2;
for(i=0;i<2*n-1;i++)
{
huffman[i].parent=-1;
huffman[i].lchild=huffman[i].rchild=-1;
}
for(i=0;i<n;i++){
huffman[i].weight=w[i];
}
for(i=n;i<2*n-1;i++){
Select(huffman,i1,i2);
huffman[i].weight=huffman[i1].weight+huffman[i2].weight;
huffman[i1].parent=i;
huffman[i2].parent=i;
huffman[i].lchild=i1;
huffman[i].rchild=i2;
}
}