Huffman Tree

题目描述

对输入的英文大写字母进行统计概率 然后构建哈夫曼树,输出是按照概率降序排序输出Huffman编码。

输入

大写字母个数 n

第一个字母 第二个字母 第三个字母 ... 第n个字母。

输出

字母1 出现次数 Huffman编码

字母2 出现次数 Huffman编码

字母3 出现次数 Huffman编码



字母n 出现次数 Huffman编码

样例输入

10

I I U U U I U N U U

样例输出

U 6 1

I 3 01

N 1 00

分析:

采用的是优先队列进行哈夫曼树的建立,然后采用的是构建新的节点,从根部进行遍历得到叶子节点的哈夫曼编码。

出现重大错误:

内存使用问题:

由于在使用过程中已经将队列中全部给弹出了,之后又要使用该节点导致了内存已经泄露.

因此要控制循环条件qu.size() > 1

代码如下:

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <cstdio>
#include <algorithm> using namespace std;
const int maxn = 27;
int rec[maxn];
struct tree
{
char ch;
int num;
tree * lchild;
tree * rchild; tree(char cc = '@',int nn = 0):ch(cc),num(nn),lchild(NULL),rchild(NULL) {}
}; struct cmp
{
bool operator()(const tree *a,const tree* b)const
{
return a->num > b->num;
}
}; priority_queue<tree*,vector<tree*>,cmp> qu; void createTree()
{
for(int i = 0 ; i < 26 ; i++)
{
if(rec[i])
{
tree * node = new tree;
node->num = rec[i];
node->ch = (char)(i+'A');
qu.push(node);
}
} while(qu.size() > 1)
{
tree * f = qu.top();
qu.pop();
tree * s = qu.top();
qu.pop(); tree * tmp = new tree();
tmp->num = f->num + s->num;
tmp->lchild = f,tmp->rchild = s;
qu.push(tmp);
}
}
struct printTree
{
int num;
char ch;
string code;
~printTree() {}
};
vector<printTree> PT;
void print(tree* root, string res)
{
if(root == NULL)
return ;
if(root->ch != '@')
{
printTree pt;
pt.num = root->num;
pt.ch = root->ch;
pt.code = res;
PT.push_back(pt);
return;
}
print(root->lchild,res+"0");
print(root->rchild,res+"1");
delete root->lchild;
delete root->rchild;
}
bool cmp2(const printTree & a,const printTree & b)
{
return a.num > b.num;
}
int main()
{
// freopen("in.txt","r",stdin);
for(int i = 0 ; i < maxn ; i++)
rec[i] = 0;
int num;
cin >> num;
char ch;
for(int i = 0 ; i < num ; i++)
{
cin >> ch;
rec[ch-'A']++;
}
createTree();
tree * root = qu.top();
qu.pop();
print(root,"");
sort(PT.begin(),PT.end(),cmp2);
for(size_t i = 0 ; i < PT.size(); i++)
{
cout << PT[i].ch << " " << PT[i].num << " " << PT[i].code << endl;
}
return 0;
}

数据结构实习 problem O Huffman Tree的更多相关文章

  1. 数据结构实习 Problem H 迷宫的最短路径

    数据结构实习 Problem H 迷宫的最短路径 题目描述 设计一个算法找一条从迷宫入口到出口的最短路径. 输入 迷宫的行和列m n 迷宫的布局 输出 最短路径 样例输入 6 8 0 1 1 1 0 ...

  2. 数据结构实习 - problem M 判断平衡二叉树

    writer:pprp date: 20171103 题目描述 给定一棵二叉树的中序和层序输出,判断是否为平衡二叉树的.如果是,输出YES如果不是输出NO. 输入 树结点个数 中序遍历序列 层序遍历序 ...

  3. 数据结构实习 problem L 由二叉树的中序层序重建二叉树

    由二叉树的中序层序重建二叉树 writer:pprp 用层序中序来重建二叉树 代码点这里 其实本质上与前序中序建立二叉树没有什么太大区别 大概思路: 递归解法,对当前层进行处理,通过层序遍历可以得到当 ...

  4. 数据结构实习 - problem K 用前序中序建立二叉树并以层序遍历和后序遍历输出

    用前序中序建立二叉树并以层序遍历和后序遍历输出 writer:pprp 实现过程主要是通过递归,进行分解得到结果 代码如下: #include <iostream> #include &l ...

  5. 数据结构实习 - Problem N 树的括号表示法

    writer:pprp date:20171103 题目描述 先将根结点放入一对圆括号中,然后把它的子树按由左而右的顺序放入括号中,而对子树也采用同样方法处理:同层子树与它的根结点用圆括号括起来,同层 ...

  6. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  7. 用优先队列构造Huffman Tree及判断是否为最优编码的应用

    前言 我们知道,要构造Huffman Tree,每次都要从堆中弹出最小的两个权重的节点,然后把这两个权重的值相加存放到新的节点中,同时让这两个节点分别成为新节点的左右儿子,再把新节点插入到堆中.假设节 ...

  8. Huffman Tree

    哈夫曼(Huffman)树又称最优二叉树.它是一种带权路径长度最短的树,应用非常广泛. 关于Huffman Tree会涉及到下面的一些概念: 1. 路径和路径长度路径是指在树中从一个结点到另一个结点所 ...

  9. 哈夫曼树(Huffman Tree)与哈夫曼编码

    哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman coding)

随机推荐

  1. 【opencv】projectPoints 三维点到二维点 重投影误差计算

    今天计算rt计算误差——重投影误差 用solvepnp或sovlepnpRansac,输入3d点.2d点.相机内参.相机畸变,输出r.t之后 用projectPoints,输入3d点.相机内参.相机畸 ...

  2. 超简单Centos+Docker+Halo搭建java向博客

    首先,我就当你们了解docker基本知识了. 直接开始,全新的系统. 1. 安装Docker 移除旧的版本:  $ sudo yum remove docker \                  ...

  3. web.xml中的元素

    error-page元素包含三个子元素error-code,exception-type和location.将错误代码(Error Code)或异常(Exception)的种类对应到web应用资源路径 ...

  4. [golang note] 类型系统

    值和引用 • 值语义和引用语义 值语义和引用语义的差别在于赋值: b = a b.Modify() 如果b的修改不会影响a的值,那么属于值类型,否则属于引用类型. • 值类型和引用类型 √ 引用类型一 ...

  5. 关于softnet的加密硬件狗 也就是所谓的赛孚耐

    SuperDog-R-2.2.1.iso 上面那个文件就是光盘里面的东西.你买了他们的产品 自然后带着这个玩意. 按照默认路径安装一下. 安装完毕如下图:

  6. xlrd xlwt操作

    简介 xlrd,xlwt和xlutils是用Python处理Excel文档(*.xls)的高效率工具.其中,xlrd只能读取xls,xlwt只能新建xls(不可以修改),xlutils能将xlrd.B ...

  7. Python(^^^^^小技巧^^^^^——不定期更新)

    偶然想到的小技巧 ''' 交互中对传入函数的参数的数目进行检测 ''' def func(a,b,c): print(a,b,c) s=input(">>>>:&qu ...

  8. PHP生成名片、网址二维码

    PHP生成名片.网址二维码 php生成名片(vcard)二维码: <?php$vname = 'test';  $vtel = '13800000000';  generateQRfromGoo ...

  9. vue Element-ui 表格自带筛选框自定义高度

    el-table中可以在一行的某列进行筛选,代码如下: <el-table-column prop="classOfTest" class="test" ...

  10. Python 控制台进度条的实现

    进行爬虫等耗时的任务时,有时会想在控制台输出进度条,以显示当前任务进度.这里总结了两种方法. 方法1:使用tqdm模块 示例代码: from time import sleep from tqdm i ...