哈夫曼树哈夫曼编码

输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。

输入格式:

第一行输入叶子结点个数,接着依次输入权值。

输出格式:

输出哈夫曼编码,输出带权路径长度。

代码如下:

复制代码
#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;
    nodes[rc].fa=p;
    nodes[rc].ch=1;
    nodes[p].num=nodes[lc].num+nodes[rc].num;
}
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 @   庞司令  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示