数据结构与算法 (七) 哈夫曼树(Huffman)与哈夫曼编码

1.算法思想

         哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)

2.算法实现

#include <stdio.h>
#include <stdlib.h>
//最小生成树  应用 哈夫曼编码
struct huffmannode
{
    int weight;
    int tag,LeftChild,RightChild;
};

typedef  struct huffmannode Huffmannode;

void InitHuffmannode(Huffmannode *h,int t,int l,int r)
{
    h->tag=t;
    h->LeftChild=l;
    h->RightChild=r;
}
struct huffmantree
{
    int root;
};

typedef struct huffmantree Huffmantree;

void InitHuffmantree(Huffmantree *ht,int r)
{
    ht->root=r;
}
//创建哈夫曼树
void makeHuffmantree(Huffmantree *ht,int a[],Huffmannode b[],int n)
{
    int i,j,m1,m2,x1,x2;
    //逐步构造 Huffman 树*/
    for(i=0; i<n; i++)
        b[i].weight=a[i];
    for(i=1; i<n-1; i++)
    {
        m1=m2=32767; //m1, m2 是任何权都大的 整数*/
        x1=x2=-1;

        for(j=0; j<n+i-1; j++)
        {
            if(b[j].weight<m1&&b[j].tag==0)
            {
                m2=m1;
                x2=x1;
                m1=b[j].weight;
                x1=j;
            }
            else if(b[j].weight<m2&&b[j].tag==0)
            {
                m2=b[j].weight;
                x2=j;
            }
        }

        b[x1].tag=1;
        b[x2].tag=1;

        //构造子树
        b[n-1+i].weight=b[x1].weight+b[x2].weight;
        b[n-1+i].LeftChild=x1;
        b[n-1+i].RightChild=x2;
        b[n-1+i].tag=0;
    }
    ht->root=2*n-2;
}
//哈夫曼编码就是利用哈夫曼树生成前缀唯一的不等长编码(从根部开始左子树是0右子树为1)
int main()
{
    printf("哈夫曼编码就是利用哈夫曼树生成前缀唯一的不等长编码(从根部开始左子树是0右子树为 \n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43870026/article/details/85224184