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. mysql union (all) 后order by的排序失效问题解决

    上sql select * FROM ( SELECT SUM(c.overtime_num) AS delay_num, ) rate , '全网' as reaCodeFROM calc_vmap ...

  2. SDUT中大数实现的题目,持续更新(JAVA实现)

    SDUT2525:A-B (模板题) import java.util.Scanner; import java.math.*; public class Main { public static v ...

  3. VUE 2.0在IE中打开页面空白的原因及解决方法

    前言 因为工作的需要,学习Vue2.0也有一段时间,最近在用Vue2.0的官方脚手架工具构建的项目,chrome中跑一直没有问题,但ie打开出现了bug: 问题 ie打开vue2.0项目空白,控制台报 ...

  4. 一个App项目设计开发完整流程

    作为一个PHP程序猿想转行APP开发可不是件容易的事情,话说隔行如隔山,这隔着一层语言也是多东西需要学习啊,一直对APP开发很感兴趣,最近请教了几个做移动开发的朋友,看了很多的资料,决定把自己学到的东 ...

  5. cdoj1587 失恋772002天

    地址:http://acm.uestc.edu.cn/#/problem/show/1587 题目: 失恋772002天 Time Limit: 3000/1000MS (Java/Others)   ...

  6. HDU - 4871 Shortest-path tree (最短路径树+ 树分治)

    题意:给你一张带权无向图,先求出这张图从点1出发的最短路树,再求在树上经过k个节点最长的路径值,以及个数. 分析:首先求最短路树,跑一遍最短路之后dfs一遍即可建出最短路树. 第二个问题,树分治解决. ...

  7. Gym - 101875I I Will Go (dfs序)

    题意:N个人要参加一个局,每个人有自己的好朋友,如果他的好朋友来,他才有可能来.N个人的关系不够成环.Q次查询,问若x来了,y是否肯定来. 分析:若点y是x的祖先,则y肯定回来.一次dfs确定每个点覆 ...

  8. java字符串分割的小练习

    最近看到一个网友的一个小问题,有关字符串分割的,思考了一下,后面给出代码:碰到一个java字符串判断结尾的问题,发现与c\c++以"\0"判断字符串结尾不同的是,java中字符串是 ...

  9. 【python】win10中python3.5.2输入pip出现Fatal error in launcher: Unable to create process using '"'

    系统:windows 10 python版本:3.5.2 出现的错误如下: C:\Users\zhuxy>pip list Fatal error in launcher: Unable to ...

  10. 【c++ primer, 5e】函数指针

    简单的示例: #include <iostream> using namespace std; int sum(int x, int y) { return x + y; } int ma ...