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. Spark源码分析 – DAGScheduler

    DAGScheduler的架构其实非常简单, 1. eventQueue, 所有需要DAGScheduler处理的事情都需要往eventQueue中发送event 2. eventLoop Threa ...

  2. Spring Data Jpa 初探

    Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问计数,包括非关系数据库.Map-Reduce 框架.云数据服务等等;另外也包含对关系数据库的访问支持. 下载网址: ...

  3. About LabView

    Recently I am running an experiment. Because the lab has only NI devices, I have to learn to use the ...

  4. vue系列

    1.vue基础 2.vue请求和跨域 3.自定义全局组件 4.vue-router 5.Vuex

  5. Apache http server linux 安装过程说明

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sundenskyqq/article/details/24733923 PS:Apache http ...

  6. 将Ext JS 5应用程序导入Web项目中

    相关资料:http://docs.sencha.com/extjs/5.1/getting_started/welcome_to_extjs.html 原文地址: https://blog.csdn. ...

  7. linux上scp远程复制的使用

    一.实例展示 两台机器IP分别为:A.104.238.161.75,B.43.224.34.73. ------把别的服务器上的资源拿到自己的上边 在A服务器上操作,将B服务器上/home/lk/目录 ...

  8. 获取IE (控件)的所有链接(包括Frameset, iframe)

    获取IE (控件)的所有链接(包括Frameset, iframe) IE 顶层 body 节点通过IHTMLElement->get_all 方法无法获取iframe 里面的节点列表 CCom ...

  9. 网络爬虫Java实现抓取网页内容

    package 抓取网页; import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream; ...

  10. phpcms v9模板制作常用代码集合

    phpcms v9模板制作常用代码集合(个人收藏) 1.截取调用标题长度 {str_cut($r[title],36,'')} 2.格式化时间 调用格式化时间 2011-05-06 11:22:33 ...