C++实现哈夫曼编码

  1. 运行结果

在这里插入图片描述

  1. 代码
#include <iostream>
#include <algorithm>

using namespace std;
#define MAXLEAF 30
#define MAXWEIGHT 1

//结点
struct HuffmanNode
{
    
    
    char node;      //结点字符
    double weight;  //结点权值
    int parent;     //父结点
    int lchild;     //左子节点
    int rchild;     //右子节点
    int no;         //节点编号
};
//每个结点的编码
struct HuffmanCode
{
    
    
    int bit[MAXLEAF];  //存储哈夫曼编码
    int length; //每个结点编码的长度
};
bool cmp1(HuffmanNode a,HuffmanNode b)
{
    
    
    return a.weight < b.weight;
}
bool cmp2(HuffmanNode a,HuffmanNode b)
{
    
    
    return a.no < b.no;
}

HuffmanNode HNode[2*MAXLEAF-1];
HuffmanCode HCode[MAXLEAF];
//输入结点构造哈夫曼树
void InputNode(int n)
{
    
    
    //初始化结点
    for(int i=0;i<2*n-1;i++)
    {
    
    
        HNode[i].weight = MAXWEIGHT;
        HNode[i].parent = -1;
        HNode[i].lchild = -1;
        HNode[i].rchild = -1;
        HNode[i].no = 2*n;
    }

    for(int i=0;i<n;i++)
    {
    
    
        cout << "Please input value and weight of leaf node" << i+1 << ": ";
        cin >> HNode[i].node >> HNode[i].weight;
        HNode[i].no = i;
    }


    for(int i=0;i<n-1;i++)
    {
    
    
        int min1=0,min2=1;
        sort(HNode,HNode+n+i,cmp1);
        for(int j=0;j<n+i;j++)
        {
    
    
            if(HNode[min1].parent!=-1)
            {
    
    
                min1++;
                min2 = min1+1;
                continue;
            }
            if(HNode[min2].parent!=-1)
                min2++;
        }
        HNode[n+i].lchild = HNode[min1].no;
        HNode[n+i].rchild = HNode[min2].no;
        HNode[n+i].weight = HNode[min1].weight+HNode[min2].weight;
        HNode[n+i].no = n+i;
        HNode[min1].parent = HNode[n+i].no;
        HNode[min2].parent = HNode[n+i].no;

    }
}

//哈夫曼编码
void Encode(int n)
{
    
    
    int offset = 2*n-1,p,j;
    HuffmanCode hc;

    sort(HNode,HNode+offset,cmp2);
    for(int i=0;i<n;i++)
    {
    
    
        hc.length = 0;
        j = i;
        p = HNode[j].parent;
        while(p != -1)
        {
    
    
            if(HNode[p].lchild == HNode[j].no)
                hc.bit[hc.length] = 0;
            else
                hc.bit[hc.length] = 1;
            hc.length++;
            j = HNode[p].no;
            p = HNode[j].parent;
        }
        for(int k=0;k<hc.length;k++)
            HCode[i].bit[k] = hc.bit[hc.length-k-1];
        HCode[i].length = hc.length;
    }
}



int main()
{
    
    
    int n;
    cout << "Please input n:";
    cin >> n;
    InputNode(n);
    Encode(n);

    //输出哈夫曼编码
    for(int i=0;i<n;i++)
    {
    
    
        cout << HNode[i].node << ": Huffman code is: ";
        for(int j=0;j<HCode[i].length;j++)
            cout << HCode[i].bit[j];
        cout << endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43790779/article/details/115095572