`
pleasetojava
  • 浏览: 750892 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

ACM哈夫曼树建立、哈夫曼编码C++实现

 
阅读更多

// 哈夫曼树.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#define MAX 20
using namespace std;
typedef char valType;
typedef double wghType;

struct HFMnode
{
valType data;
wghType weight;
int parent;
int lchild;
int rchild;
};
//每个节点的编码
//code存储编码
//start存储编码是从code数组的第几个开始
//在编码过程中从叶子节点向根节点逆推
struct HFMcode
{
char code[MAX];
int start;
};
//建立哈夫曼树
void createHFMtree(HFMnode *node,int n)
{
int i;
//m1,m2为当前还没用到的节点中权值最小和次小的权值
int m1,m2;
//l,r为每次构建一个父节点其左右儿子节点的序号
int l,r;
for(i=n+1;i<=2*n-1;i++)
{
m1=m2=32767;
l=r=0;
int k;
for(k=1;k<=i-1;k++)
if(node[k].parent==0)
{
if(node[k].weight<m1)
{
m2 = m1;
r = l;
m1 = node[k].weight;
l = k;
}
else if(node[k].weight<m2)
{
m2 = node[k].weight;
r = k;
}
}
node[i].weight = node[l].weight + node[r].weight;
node[i].lchild = l;
node[i].rchild = r;
node[l].parent = i;
node[r].parent = i;
}
}
//求每个节点的哈夫曼编码
void createHFMcode(HFMnode *node, HFMcode *hcode,int n)
{
int i;
for(i=1;i<=n;i++)
{
HFMcode d;
//哈夫曼树最大层数就是元素的个数
d.start = n;
int num=i;
int father = node[num].parent;
while(father!=0)
{
if(node[father].lchild==num)
d.code[d.start--]='0';
else
d.code[d.start--]='1';
num = father;
father = node[num].parent;
}
hcode[i]=d;
}
}
//打印每个节点的编码
void printHFMcode(HFMnode * node,HFMcode * hcode,int n)
{
int i;
for(i=1;i<=n;i++)
{
cout<<node[i].data<<" :";
for(int k = hcode[i].start+1; k<=n;k++)
cout<<hcode[i].code[k];
cout<<endl;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
HFMnode node[2*MAX];
HFMcode hcd[MAX];
cout<<"请输入案例个数:"<<endl;
int cases;
cin >> cases;
while(cases--)
{
cout<<"请输入元素个数:"<<endl;
int n;
cin>>n;
int i;
for(i=1;i<=n;i++)
{
cout<<"输入第"<<i<<"个节点的值:"<<endl;
cin>>node[i].data;
cout<<"输入它的权重:"<<endl;
cin>>node[i].weight;
}
for(i=1;i<=2*n-1;i++)
{
node[i].parent=node[i].lchild=node[i].rchild=0;
}
//建立哈夫曼树
createHFMtree(node,n);
//求每个节点的哈夫曼编码
createHFMcode(node,hcd,n);
//打印每个节点的编码
cout<<"输出每个节点的哈夫曼编码:"<<endl;
printHFMcode(node,hcd,n);
}
return 0;
}

分享到:
评论

相关推荐

    中山大学acm比赛试题

    8. **编码解码**:涉及位操作、哈夫曼编码、RSA加密等。 9. **交互式问题**:需要程序与裁判系统进行交互,实现特定功能。 通过这些试题,学生可以不断提升自己的算法设计和实现能力,同时也能锻炼在压力下思考和...

    SCPC-ACM讲义

    - 重复上述步骤直到只剩下一个节点,即为哈夫曼树的根节点。 **1.3 线段树** - **定义**:一种能够高效查询区间信息的树形数据结构。 - **应用场景**:适合处理区间更新和区间查询等问题。 - **特点**: - 通过对...

    ACM训练方案

    5. 哈夫曼树:用于压缩数据,如poj3253。 6. 堆:如poj2299中的堆排序。 7. Trie树:用于字符串搜索,如poj2513。 四、简单搜索 1. 深度优先搜索(DFS):如poj2488。 2. 广度优先搜索(BFS):如poj3278。 3. 搜索...

    acm poj300题分层训练

    poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...

    ACM北大训练

    - **定义**: 哈夫曼树是一种带权路径长度最短的二叉树。 - **应用场景**: 常用于数据压缩领域。 - **示例题目**: - poj3253: 涉及哈夫曼树构建问题。 ##### 6. Trie树 - **定义**: Trie 树是一种用于存储字符串的...

    ACM算法总结大全——超有用!.docx

    * 哈夫曼树 * 堆 * Trie树(静态建树、动态建树) 搜索 * 深度优先搜索 * 广度优先搜索 * 简单搜索技巧和剪枝 动态规划 * 背包问题 * 型如下表的简单DP * 最长公共子序列 * 最优二分检索树问题 数学 * 组合...

    pku 3253试题答案

    在给定的代码段中,`HaffNode`结构体用于表示哈夫曼树的节点,包括权值、标志(区分根节点与非根节点)、双亲节点和子节点下标等信息。哈夫曼编码的实现涉及到节点的合并和树的构造,但在这个题目中没有给出完整的...

    ACM算法总结大全——超有用!

    5. 哈夫曼树:用于压缩编码,如poj3253。 6. 堆:优先队列实现,如poj1459。 7. Trie树:用于高效字符串查询,如poj2513。 四、简单搜索 1. 深度优先搜索(DFS):如poj2488、poj3083等。 2. 广度优先搜索(BFS):...

    ACM 详解算法目录

    数据结构部分涵盖了串、排序、简单并查集、哈希表和二分查找、哈夫曼树、堆和trie树八个方面。例如,POJ1035和POJ3080是串的经典例题,而POJ2388和POJ2299则是排序算法的代表题。 在简单搜索部分,涵盖了深度优先...

    Acm竞赛常用算法与数据结构

    - **数据压缩与编码**:哈夫曼编码、LZW编码等。 - **计算几何**:涉及点、线、面的计算,如最近点对查询、面积计算等。 4. **时空复杂度分析**: - **时间复杂度**:衡量算法执行所需的基本操作次数,如O(n),O...

    ACM算法总结大全——超有用!.pdf

    5. **哈夫曼树**:用于数据压缩,如POJ3253。 6. **堆**:数据结构,常用于优先队列和最短路径算法。 7. **Trie树**:用于高效字符串查找和构建,分为静态建树和动态建树,如POJ2513。 **搜索** 1. **深度优先...

    ACM常用算法及其相应的练习题 (2).docx

    本部分涵盖了数据结构,包括串、排序、简单并查集的应用、哈希表和二分查找等高效查找法、哈夫曼树和堆、trie树。 (1) 串:poj1035, poj3080, poj1936 (2) 排序:快排、归并排、堆排 (3) 简单并查集的应用: (4) ...

    ACM常用算法及其相应的练习题 (2).pdf

    * 哈夫曼树:哈夫曼树是指用于数据压缩的树形数据结构。例题:poj3253。 * 堆:堆是指用于排序和优先级队列的数据结构。例题:无。 * Trie树:Trie树是指用于字符串匹配的树形数据结构。例题:poj2513。 四、简单...

    ACM常用算法及其相应的练习题.pdf

    * 哈夫曼树:用于解决字符串压缩问题。 * 堆:一种特殊的树状数据结构。 * trie树:一种特殊的树状数据结构。 搜索 * 深度优先搜索:一种常用的搜索算法。 * 广度优先搜索:一种常用的搜索算法。 * 简单搜索技巧和...

    第3章 第1-2节 树及二叉树(C++版).ppt

    在实际应用中,二叉树可以用于实现二分查找、堆排序、哈夫曼编码等算法,同时在构建搜索树(如A*搜索、深度优先搜索、广度优先搜索)时,二叉树或其变种扮演着核心角色。 总结来说,树和二叉树是计算机科学中至关...

    ACM常用算法及其相应的练习题.docx

    * 哈夫曼树:poj3253 * 堆 * Trie树:静态建树、动态建树 + poj2513 四、简单搜索 * 深度优先搜索:poj2488, poj3083, poj3009, poj1321, poj2251 * 广度优先搜索:poj3278, poj1426, poj3126, poj3087, poj3414 ...

    基于 C++ MFC 的文本压缩软件【100010875】

    通过这次哈夫曼编码译码器的制作,对 C++ 的 STL 又进一步了解了比如优先级队列,bitsit 类等等,也初探红黑树的强大,将 ACM 学到的算法在此得到了优化,还学习了 C++ 文件的定位,文件指针等等,遗憾的是没有太多...

    贪心算法总结

    这种策略并不保证总能得到全局最优解,但在某些特定问题上,如最小生成树、哈夫曼编码、背包问题等,贪心策略能够得到正确的结果。 在ACM竞赛中,贪心算法常用于解决如下类别的问题: 1. **最小生成树问题**:如...

    2008 Singapore National Olympiad in Informatics(11th NOI)

    编码解码问题则涉及到字符串处理和编码技术,如位运算、奇偶校验、哈夫曼编码等。选手需要理解不同编码方式的原理,并能在实际问题中灵活应用。 在准备此类竞赛时,参赛者不仅需要扎实的理论知识,还需要良好的编程...

Global site tag (gtag.js) - Google Analytics