C++实现哈夫曼树与哈夫曼编码

哈夫曼树的存储表示

typedef char ElemType;
typedef struct
{
    ElemType data;              //结点存的数据
    int weight;                 //结点的权值
    int parent,lchild,rchild;   //结点的双亲、左孩子、右孩子的下标
} HTNode,*HuffmanTree;          //动态分配数组存储哈夫曼树

构造哈夫曼树

void CreateHuffmanTree(HuffmanTree &HT,int n)
{
    //构造哈夫曼树HT
    if(n<=1)
    {
        cout<<"HuffmanTree节点数输入错误!"<>HT[i].weight;
    }
    //--------------------------初始化工作结束,下面开始创建完整哈夫曼树
    for(int i=n+1; i<=m; ++i)
    {
        //通过n-1次的选择、删除、合并来创建哈夫曼树
        Select(HT,i-1,s1,s2);                       //在HT[k](1<=k<=i-1)中选择两个其双亲域为0且权值最小的结点,并返回它们在HT中的序号s1和s2
        HT[s1].parent=i;
        HT[s2].parent=i;            //得到新结点i,从森林中删除s1,s2,将s1和s2的双亲域由0改为i
        HT[i].lchild=s1;
        HT[i].rchild=s2;            //s1,s2分别作为i的左右孩子
        HT[i].weight=HT[s1].weight+HT[s2].weight;   //i的权值为左右孩子权值之和
    }
}

哈夫曼编码的存储表示

typedef char **HuffmanCode;//动态分配数组存储哈夫曼编码表

根据哈夫曼树求哈夫曼编码表

void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int &n)
{
    //从叶子到根逆向求每个字符的哈夫曼编码,存储在编码表HC中
    HC=new char*[n+1];      //分配存储n个字符编码的编码表动态空间
    char *cd=new char[n];    //分配临时存放每个字符编码的动态数组空间
    cd[n-1]='\0';           //(末尾)编码结束符
    for(int i=1; i<=n; i++) //逐个字符求哈夫曼编码
    {
        int start=n-1;      //start开始时指向最后,即编码结束符位置
        int c=i,f=HT[i].parent;//f指向结点c的双亲结点
        while(f!=0)         //从叶子结点开始向上回溯,直到根结点
        {![在这里插入图片描述](https://img-blog.csdnimg.cn/20190602094744711.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNjY0NDQ3,size_16,color_FFFFFF,t_70)
            --start;
            if(HT[f].lchild==c) cd[start]='0';//结点c是f的左孩子,则生成代码0
            else cd[start]='1';               //结点c是f的右孩子,则生成代码1
            c=f;
            f=HT[f].parent;               //继续向上回溯
        }                   //求出第i个字符的编码(结点为c,双亲为f;之后结点为f,双亲为HT[f].parent)
        HC[i]=new char[n-start];              //为第i个字符编码分配空间
        strcpy(HC[i],&cd[start]);             //将求得的编码从临时空间cd复制到HC的当前行中(导入:#include)
    }                       //for
    delete cd;              //释放临时空间
}

运行截图

(输入a-z以及空格为哈夫曼树的数据,求出对应的哈夫曼编码表,实现英文以及对应的哈夫曼编码的相互转换)
C++实现哈夫曼树与哈夫曼编码_第1张图片
C++实现哈夫曼树与哈夫曼编码_第2张图片
C++实现哈夫曼树与哈夫曼编码_第3张图片
C++实现哈夫曼树与哈夫曼编码_第4张图片
C++实现哈夫曼树与哈夫曼编码_第5张图片
C++实现哈夫曼树与哈夫曼编码_第6张图片
完整源代码下载地址:https://download.csdn.net/download/qq_41664447/11221762

你可能感兴趣的:(C++,算法,数据结构)