PTA 哈夫曼树与哈夫曼编码
输入格式:
输入有3行。 第1行:符号个数n(2~20)。 第2行:一个不含空格的字符串。记录着本题的符号表。我们约定符号都是单个的小写英文字母,且从字符‘a’开始顺序出现。也就是说,如果 n 为 2 ,则符号表为 ab ;如果 n 为 6,则符号为 abcdef;以此类推。 第3行:各符号出现频率(用乘以100后的整数),用空格分隔。
输出格式:
先输出构造的哈夫曼树带权路径长度。 接下来输出n行,每行是一个字符和该字符对应的哈夫曼编码。字符按字典顺序输出。字符和哈夫曼编码之间以冒号分隔。
例如:
a:10
b:110
输入样例:
在这里给出一组输入。例如:
8
abcdefgh
5 29 7 8 14 23 3 11
输出样例:
在这里给出相应的输出。例如:
271
a:0001
b:10
c:1110
d:1111
e:110
f:01
g:0000
h:001
提示: 以上示例数据,按题目要求建立的Haffman Tree如下图:
解题思路:
用最小优先队列存储各节点,每次弹出两个后,把两个之和又加入队列,以此来构建哈夫曼树的结构,结构构建好后,利用回溯法得到每一个叶节点的哈夫曼编码值并记录,统计总权值.
代码:
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
string alp = "abcdefghijklmnopqrstuvwxyz";
string code[22]; //记录哈夫曼码
int ans; //计算权值/*最小优先队列*/
struct Tree{int Weight;char name;Tree *Left, *Right;
};
struct cmp{bool operator ()(const Tree T1, const Tree T2){return T1.Weight >= T2.Weight;}
};
priority_queue<Tree, vector<Tree>, cmp> q;/*中序遍历, 检查树的结构*/
// void Browse(Tree *T)
// {// if(!T)
// return;
// Browse(T->Left);
// cout << T->name << " " << T->Weight << endl;
// Browse(T->Right);
// }/*建立好树结构后,用回溯法遍历*/
string Code;
void dfs(Tree* T)
{if(!T->Left && !T->Right){code[T->name - 'a'] = Code;ans += T->Weight * Code.size();return;}Code.push_back('0');dfs(T->Left);Code.pop_back();Code.push_back('1');dfs(T->Right);Code.pop_back();
}/*释放内存*/
void Destroy(Tree *T)
{if(!T->Left && !T->Right){delete T;T = NULL;return;}Destroy(T->Left);Destroy(T->Right);
}int main()
{int n, W[22];string str;cin >> n >> str;for (int i = 0; i < n; i++)cin >> W[i], q.push({W[i], str[i], NULL, NULL});Tree *L, *R, *T;Tree a, b;while (!q.empty()){a = q.top(), q.pop();L = new Tree();L->Weight = a.Weight, L->name = a.name;L->Left = a.Left, L->Right = a.Right;if(!q.empty()){b = q.top(), q.pop();R = new Tree();R->Weight = b.Weight, R->name = b.name;R->Left = b.Left, R->Right = b.Right;}elsebreak;q.push({a.Weight + b.Weight, '-', L, R});}T = L; //建立好的树结构dfs(T);Destroy(T);cout << ans << endl;for (int i = 0; i < n; i++)cout << alp[i] << ":" << code[i] << endl;system("pause");return 0;
}
注意:
c++最小优先队列部分可参考:
https://blog.csdn.net/disguise666/article/details/85989788
PTA 哈夫曼树与哈夫曼编码相关推荐
- 蓝桥哈夫曼树C语言,实验四 哈夫曼树及哈夫曼编码
实验目的## 掌握哈夫曼树的概念.哈夫曼编码及其应用. 掌握生成哈夫曼树的算法. 会用哈夫曼树对传输报文进行编码. 掌握二叉树的二叉链表存储方式及相应操作的实现. ##实验内容## 用哈夫曼编码进行通 ...
- python哈夫曼树_python霍夫曼树
class Node(): data=0 left=None right=None father=None def __init__(self,data,left,right): self.data= ...
- 一文看懂哈夫曼树与哈夫曼编码
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUF ...
- 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现
闲扯前言 哈夫曼编码的代码实现对于初学数据结构的同学可能会有些困难,没有必要灰心,其实没啥,学习就犹如攀登一座又一座的山峰,每当我们攻克一个难点后,回首来看,也不过如此嘛.我们要做的就是不断的去攀越学 ...
- 听说你还不懂哈夫曼树和哈夫曼编码
基本概念 哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途. 基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径. 路径长度:路径上的分 ...
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码
第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...
- 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算
1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...
- 【数据结构】-哈夫曼树以及哈夫曼编码
哈夫曼树的几个定义 哈夫曼树又叫最优二叉树:特点是带权路径最短 带权路径长度:该结点到根结点的路径长度乘以该结点的权值. 树的带权路径长度(WPL):所有叶子结点到根结点的带全路径长度之和. 最优二叉 ...
- C++ 实现哈夫曼树和哈夫曼编码
C++ 实现哈夫曼树和哈夫曼编码 一.哈夫曼树的定义 二.哈夫曼树的构造算法 三.哈夫曼编码 四.哈夫曼算法实现 1.定义一个结点类 2.定义一个哈夫曼编码类 3.定义一个哈夫曼树类 4.设置初始值 ...
最新文章
- .CN域名总量达1090.6万个:8月份共净增13.8万个
- CISSP考前总复习
- pwn(ctf)中常见的系统调用
- JRE与JDK,SDK的区别
- linux kill进程后黑屏,Linux中Kill进程的N种方法
- Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (离线树状数组+前缀xor)
- linux sed 循环多行,linux sed 多行处理详细总结
- 【Level 08】U08 Positive Attitude L4 News flash
- matlab单机带负荷系统模型,用MATLAB仿真实现电力系统静态稳定性分析
- CentOS首次安装,网络环境配置
- iOS开发-当APP涉及到用户敏感信息适配Xcode9及(ios11)
- make files touse cmd line to protect exe
- 网络编程 基础 基于socket的tcp和udp连接
- 辽宁移动客服呼叫中心两级质检管理效果佳
- Java集合类和HashMap遍历
- 大神u盘工具(win10PE)UEFI纯净版启动盘制作工具
- UE4特效萌新上手笔记-Houdini导Niagara配置
- Web渗透测试工程师:入门知识
- Oracle中Having子句的意思
- 最常被遗忘的 Web 性能优化:浏览器缓存
热门文章
- 联想拯救者y7000电脑开机一直是锁屏界面,点一下就黑屏,无法进入输密码界面
- 汇编语言 从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果
- 前辈们整理的SAP的相关链接
- Backtrader(十一) - Indicator指标
- asp毕业设计—— 基于asp+access的软件信息发布系统设计与实现(毕业论文+程序源码)——软件信息发布系统
- 计算机考试贷款日到期日,怎么样用金融计算器算利率和期限
- webpack、sass-loader、npm audit fix、npm audit fix --force兼容性问题
- Python爬取豆瓣电影top250的电影信息
- 实验6 Sniffer网络安全检测
- MFC下改变窗口或编辑框标题字体大小的方法