C++实现哈夫曼编码
作者:南小呗 发布时间:2022-07-20 20:39:01
标签:C++,哈夫曼编码
本文实例为大家分享了C++实现哈夫曼编码的具体代码,供大家参考,具体内容如下
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int Max = 300;
class tree{
public:
char s;
int num;
tree *left;
tree *right;
tree(){
s= '!';
num = 0;
left = 0;
right = 0;
}
tree(char a,int n,tree* p1,tree* p2){
s = a;
num = n;
left = p1;
right = p2;
}
};
vector<tree *> open;
/*********************************
**中序遍历输出各节点及其哈夫曼编码
*********************************/
void inorder(tree *t,string s){
if(t != 0){
inorder(t->left,s+'0');
if(t->s != '!')
cout<<t->s<<":"<<s<<endl;
inorder(t->right,s+'1');
}
}
int main(){
int a[Max];
for(int i = 0;i < Max;i++)
a[i] = 0; //初始化数组
string s;
cout<<"请输入字符串:";
cin>>s;
vector<char> v;
vector<char>::iterator vit;
for(int i = 0;i < s.length();i ++){
a[s[i]]++; //确定每个字符出现的次数(频率)
vit = find(v.begin(),v.end(),s[i]);
if(vit == v.end()) //相同的字符只保留一个
v.push_back(s[i]);
}
for(int i = 0;i < v.size();i ++){
tree *n = new tree();
n->s = v[i];
n->num = a[v[i]];
open.push_back(n); //存入open表中
}
/************************
**
**构造哈夫曼树
**
*************************/
tree *root;
while(open.size() != 1){
tree *min1,*min2; //min1,min2是当前open表中num值最小的节点
int sit1,sit2;
min1 = open.front();
sit1 = 0;
for(int i = 0;i < open.size();i++){
if(open[i]->num < min1->num){
min1 = open[i];
sit1 = i;
}
}
open.erase(open.begin()+sit1);
min2 = open.front();
sit2 = 0;
for(int i = 0;i < open.size();i++){
if(open[i]->num < min2->num){
min2 = open[i];
sit2 = i;
}
}
open.erase(open.begin()+sit2);
tree *t = new tree('!',min1->num + min2->num,min1,min2); //构造新节点,左右指针指min1和min2
open.push_back(t); //存入open表中
root = t;
}
cout<<"它的哈夫曼编码为:"<<endl;
string s1 = "";
inorder(root,s1);
return 0;
}```
来源:https://blog.csdn.net/TKFEET/article/details/89394104


猜你喜欢
- 本文实例为大家分享了java编写的贪吃蛇源码,供大家参考,具体内容如下程序共包含以下两个文件:文件:ShellWin.javaimport
- 在Android开发过程中,有时会需要一些消息提示,大多数情况可以用dialog来做,但有些消息不需要用户去点击取消并且不能对用户体验产生影
- 本文实例讲述了Java内部类对象的创建及hook机制。分享给大家供大家参考,具体如下:Java中的内部类虽然在状态信息上与其外围类在状态信息
- 有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有
- 反射允许我们在编译期或运行时获取程序集的元数据,通过反射可以做到:● 创建类型的实例● 触发方法● 获取属性、字段信息● 延迟绑定.....
- 文章描述跑马灯效果,功能效果大家应该都知道,就是当我们的文字过长,整个页面放不下的时候(一般用于公告等),可以让它自动实现来回滚动,以让客户
- 写在前面 众所周知,kafka是现代流行的消息队列,它使用经典的消息订阅发布模式实现消息的流转,大部分代码结合kaf
- 拖延症最可怕的地方就是:就算自己这边没有拖延,但对方也会拖延,进而导致自己这边也开始拖延起来!现在这个项目我这边已经是完工了,但是对方迟迟没
- 前言一般情况下,当我们使用 SpringDataElasticsearch 去操作 ES 时,索引名
- 前言 之前的文章有介绍ActivityGroup,不少人问嵌套使用的问题,同样的需求在Fragment中也存在,幸好在最新的An
- 前面几篇文章学习了AndroidStudio插件的基础后,这篇文章打算开发一个酷炫一点的插件。因为会用到前面的基础,所以如果没有看前面系列文
- from jnius import autoclass>>> Stack = autoclass('java.ut
- 一.前言RabbitMQ的TTL全称为Time-To-Live,表示的是消息的有效期。消息如果在队列中一直没有被消费并且存在时间超过了TTL
- 关于《JavaCV的摄像头实战》系列《JavaCV的摄像头实战》顾名思义,是使用JavaCV框架对摄像头进行各种处理的实战集合,这是欣宸作为
- 有些人可能对线程池比较陌生,并且更不熟悉线程池的工作原理。所以他们在使用线程的时候,多数情况下都是new Thread来实现多线程。但是,往
- java简单模拟微信抢红包功能,本例发100元红包,有10个人抢,为了尽可能的公平,每个人的红包金额都要随机(保证结果的不确定性,本例抢红包
- 本文实例讲述了Android编程实现的短信编辑器功能。分享给大家供大家参考,具体如下:修改短信数据库,从而生成任意手机号发送的短信。Andr
- groovy是一种动态脚本语言,适用于一些可变、和规则配置性的需求,目前Spring提供ScriptSource接口,支持两种类型,一种是R
- 一、ID生成策略1、使用@TableId注解@TableId注解:主键注解使用位置:实体类主键字段。@Data@ToString@Table
- 什么是委托?委托是寻址方法的.NET版本,使用委托可以将方法作为参数进行传递。委托是一种特殊类型的对象,其特殊之处在于委托中包含的只是一个活