算法与数据结构——哈夫曼树哈夫曼编码

题目:

 

代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int N=100010;
//权值,父系节点,子系节点
struct node
{
    int num,fa,ch;
};

bool st[N];
int n;
node* nodes;//权值
//根据权值找下标
int find(int n)
{
    int p=0;
    for(int i=1;i<=n;i++)
    {
        if(st[i]==0&&(p==0||nodes[i].num<nodes[p].num))
        {
            p=i;
        }
    }
    return p;
}
//构建树
void add(int lc,int rc,int p)
{
    nodes[lc].fa=p;
    nodes[lc].ch=-1;//不能赋0的原因是全局变量不赋值,默认是0
    nodes[rc].fa=p;
    nodes[rc].ch=1;
    nodes[p].num=nodes[lc].num+nodes[rc].num;
}
//huffman编码
string huffman(int k)
{
    string s;
    if(nodes[k].fa){
        s=huffman(nodes[k].fa);
    }
    if(nodes[k].ch){
        s+=nodes[k].ch==-1?"0":"1";
    }
    return s;
}

int main()
{
    cin>>n;
    nodes=new node[2*n];
    
    for(int i=1;i<=n;i++)
    {
        cin>>nodes[i].num;
    }
    
    if(n==1||n==0)
    {
        cout<<"error";
    }
    else
    {
        int l=n+1,r=2*n-1;
        
        while(l<=r)
        {
            int c1=find(l-1);
            st[c1]=1;
            int c2=find(l-1);
            st[c2]=1;
            add(c1,c2,l++);
        }
        
        int wpl=0;
        
        for(int i=1;i<=n;i++)
        {
            string s=huffman(i);
            cout<<nodes[i].num<<"编码为"<<s<<endl;
            wpl+=nodes[i].num*s.size();
        }
        cout<<"WPL:"<<wpl;
    }
    
    return 0;
}

参考:哈夫曼树哈夫曼编码 - 清梦韶华 - 博客园 (cnblogs.com)

 

#include<iostream>#include<cstdio>using namespace std;const int N=100010;//权值,父系节点,子系节点struct node{    int num,fa,ch;};
bool st[N];int n;node* nodes;//权值//根据权值找下标int find(int n){    int p=0;    for(int i=1;i<=n;i++)    {        if(st[i]==0&&(p==0||nodes[i].num<nodes[p].num))        {            p=i;        }    }    return p;}//构建树void add(int lc,int rc,int p){    nodes[lc].fa=p;    nodes[lc].ch=-1;//不能赋0的原因是全局变量不赋值,默认是0    nodes[rc].fa=p;    nodes[rc].ch=1;    nodes[p].num=nodes[lc].num+nodes[rc].num;}//huffman编码string huffman(int k){    string s;    if(nodes[k].fa){        s=huffman(nodes[k].fa);    }    if(nodes[k].ch){        s+=nodes[k].ch==-1?"0":"1";    }    return s;}
int main(){    cin>>n;    nodes=new node[2*n];        for(int i=1;i<=n;i++)    {        cin>>nodes[i].num;    }        if(n==1||n==0)    {        cout<<"error";    }    else    {        int l=n+1,r=2*n-1;                while(l<=r)        {            int c1=find(l-1);            st[c1]=1;            int c2=find(l-1);            st[c2]=1;            add(c1,c2,l++);        }                int wpl=0;                for(int i=1;i<=n;i++)        {            string s=huffman(i);            cout<<nodes[i].num<<"编码为"<<s<<endl;            wpl+=nodes[i].num*s.size();        }        cout<<"WPL:"<<wpl;    }        return 0;}
posted @ 2022-11-16 17:55  sodamate  阅读(20)  评论(0编辑  收藏  举报