C++ 作业(哈夫曼树)

#include<bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;
const int maxn=1e2+10;
map<char,string> mp;
map<string,char> pm;
struct pos
{
     char x;
     int num;
     pos *father=NULL;
     pos *lson=NULL;
     pos *rson=NULL;
     pos *p=NULL;
     friend bool operator < (pos a, pos b)
     {
        return a.num > b.num;    //重载小于号使得小的先出队列
     }
}tree[maxn];

void make_DFS(pos &root,string ss)
{
    if(root.lson==NULL && root.rson==NULL)
    {
        //cout<<root.x<<endl;
        mp[root.x]=ss;
        pm[ss]=root.x;
    }
    else
    {
        make_DFS(*root.lson,ss+"0");
        make_DFS(*root.rson,ss+"1");
    }
}
void build_tree(pos &root)
{
    priority_queue<pos> qu;  //  pos 结构体
    for(int i=0;i<=26;i++)
    {
        qu.push(tree[i]);
    }
    while(!qu.empty())
    {
        pos *qq;
        qq=qu.top().p;
        qu.pop();
        pos *pp;
        pp=qu.top().p;
        qu.pop();
       if(qu.size()==0)
       {
           root.lson=pp;
           root.rson=qq;
           break;
       }
        (*pp).father=new pos;
        pos *x=(*pp).father;
        (*x).lson=pp;
        (*x).rson=qq;
        (*x).x='*';
        (*x).num=(*pp).num+(*qq).num;
        //cout<<(*x).num<<endl;
        (*x).p=&(*x);

        qu.push(*x);
    }
    //cout<<"make tree   OK"<<endl;
    make_DFS(root,"");
}
int32_t main()
{
            freopen("tree.txt","r",stdin);
            tree[0].x=' ';
            for(int i=1;i<=26;i++)  cin>>tree[i].x;
            for(int i=0;i<=26;i++)  cin>>tree[i].num;
            for(int i=0;i<=26;i++)  tree[i].p=&tree[i];
            pos root;
            build_tree(root);
            for(int i=0;i<=26;i++)
            {
                 cout<<tree[i].x<<"   "<<tree[i].num<<"   "<<mp[tree[i].x]<<"   "<<pm[mp[tree[i].x]]<<endl;
            }
            char a[200];
            getchar();gets(a);  cout<<a<<endl;   int l=strlen(a);
            cout<<"编码"<<endl;  for(int i=0;i<l;i++)cout<<mp[a[i]];cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);
            cout<<"编码"<<endl;  for(int i=0;i<l;i++)cout<<mp[a[i]];cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);
            cout<<"编码"<<endl;  for(int i=0;i<l;i++)cout<<mp[a[i]];cout<<endl;
            cout<<"----------------------------------------"<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);  cout<<"译码"<<endl;  string ss="";
            for(int i=0;i<l;i++)
            {
                ss=ss+a[i];
                if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z'))
                {
                    cout<<pm[ss];   ss="";
                }
            }cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);  cout<<"译码"<<endl;   ss="";
            for(int i=0;i<l;i++)
            {
                ss=ss+a[i];
                if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z'))
                {
                    cout<<pm[ss];   ss="";
                }
            }cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);  cout<<"译码"<<endl;   ss="";
            for(int i=0;i<l;i++)
            {
                ss=ss+a[i];
                if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z'))
                {
                    cout<<pm[ss];   ss="";
                }
            }cout<<endl;

}

 

转载于:https://www.cnblogs.com/Andromeda-Galaxy/p/10181194.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈夫曼树是一种基于字符频率来构建的最优二叉树,用于压缩和解压缩数据。在 C++ 中,可以通过以下步骤来实现哈夫曼树: 1. 定义结构体存储哈夫曼树节点信息,包括字符、权值、左右子节点等信息。 ``` struct TreeNode { char ch; int freq; TreeNode *left, *right; }; ``` 2. 构建哈夫曼树的主要过程是先将字符按照频率从小到大排序,然后将最小的两个节点合并为一个新节点,其权值为两个节点权值之和。重复此过程直到只剩下一个节点,即为哈夫曼树的根节点。可以使用 STL 中的 priority_queue 来实现节点合并的过程。 ``` struct cmp { bool operator() (TreeNode* a, TreeNode* b) { return a->freq > b->freq; } }; void buildHuffmanTree(vector<char>& chars, vector<int>& freqs) { priority_queue<TreeNode*, vector<TreeNode*>, cmp> pq; for (int i = 0; i < chars.size(); ++i) { TreeNode* node = new TreeNode(chars[i], freqs[i]); pq.push(node); } while (pq.size() > 1) { TreeNode* left = pq.top(); pq.pop(); TreeNode* right = pq.top(); pq.pop(); TreeNode* parent = new TreeNode('#', left->freq + right->freq); parent->left = left; parent->right = right; pq.push(parent); } } ``` 3. 对于给定的字符串,可以通过哈夫曼树得到每个字符的编码,即左子节点对应编码为 0,右子节点对应编码为 1。可以使用递归的方式遍历哈夫曼树,生成编码表。 ``` unordered_map<char, string> generateCodeMap(TreeNode* root) { unordered_map<char, string> codeMap; function<void(TreeNode*, string)> dfs = [&](TreeNode* node, string code) { if (!node) return; if (node->ch != '#') codeMap[node->ch] = code; dfs(node->left, code + "0"); dfs(node->right, code + "1"); }; dfs(root, ""); return codeMap; } ``` 以上就是使用 C++ 实现哈夫曼树的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值