一:数据结构 c语言版 哈弗曼树 实验
#include
二:求高手完成Huffman编码/解码实验的实验报告
偶的空间有现成的,改改就是了~
三:求高手们二叉树实验报告 注意是“数据结构C++版”的
哥 你不给分 >?
四:我们有个数据结构的哈夫曼编码解码的课程设计,你能帮帮我吗
树和哈夫曼树实验报告
一.实验目的
练习树和哈夫曼树的有关操作,和各个算法程序,理解哈夫曼树的编码和译码
二.实验环境
Microsoft visual c++
三.实验问题描述
1. 问题描述:建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。
基本要求:从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立),并将此二叉树按照“树状形式”打印输出,然后对其进行遍历(先序、中序和后序),最后将遍历结果打印输出。在遍历算法中要求至少有一种遍历采用非递归方法。
测试数据:
ABCØØDEØGØØFØØØ(其中Ø表示空格字符)
输出结果为:
先序:ABCDEGF
先序:CBEGDFA
先序:CGEFDBA
2. 问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接受端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。
基本要求:(至少完成功能1-2)
一个完整的系统应具有以下功能:
I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
基本要求:
E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
D:译码(Decoding )。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrint中。
T:印哈夫曼树(TreePrinting)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
测试数据:
设权值w=(5,29,7,8,14,23,3,11),n=8。
按照字符‘0’或‘1’确定找左孩子或右孩子,则权值对应的编码为:
5:0001,29:11,7:1110,8:1111
14:110,23:01,3:0000,11:001
用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。
四.实验主要程序流
实验题目一主要程序:
1.
void CreatBiTree(BitTree *bt)//用扩展先序遍历序列创建二叉树,如果是#当前树根置为空,否则申请一个新节点//
{
char ch;
ch=getchar();
if(ch=='.')*bt=NULL;
else
{
*bt=(BitTree)malloc(sizeof(BitNode));
(*bt)->data=ch;
CreatBiTree(&((*bt)->LChild));
CreatBiTree(&((*bt)->......余下全文>>
五:一、实验题目:用哈夫曼编码实现文件压缩用C++实现 急用
这是我的实验报告:student.csdn.net/...51206/**
* @brief 哈夫曼编码
* @date 2010-11-30
*/
#include
#include
#include
#include
using namespace std;
/**
* @brief 哈弗曼结点
* 记录了哈弗曼树结点的数据、权重及左右儿子
*/
struct HTNode {
char data;
HTNode *lc, *rc;
int w;
/** 节点构造函数 */
HTNode(char _d, int _w, HTNode *_l = NULL, HTNode *_r = NULL)
{
data = _d;
w = _w;
lc = _l;
rc = _r;
}
/** 节点拷贝构造函数 */
HTNode(const HTNode &h)
{
data = h.data;
lc = h.lc;
rc = h.rc;
w = h.w;
}
/** 用于优先队列比较的运算符重载 */
friend bool operator < (const HTNode &a, const HTNode &b)
{
return a.w > b.w;
}
};
/** 哈弗曼树叶子节点数、各叶子结点数据及权重 */
/** 权值从Lolita小说中抽样取出 */
const char ch[] = {
10, 32, 33, 37, 40, 41, 44, 45, 46, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59, 63, 65, 66, 67, 68, 69, 70, 71, 72,
73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
83, 84, 85, 86, 87, 88, 89, 90, 91, 93,
97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
107, 108, ......余下全文>>
六:一、实验题目:用哈夫曼编码实现文件压缩用C++实现
这是我的实验报告: student.csdn.net/...=51206 /** * @brief 哈夫曼编码 * @date 2010-11-30 */ #include
七:求一个数据结构课程设计关于赫夫曼编码/解码的问题!!! 急!!!!!
Btree p = NULL;
string dest;
for (int i=0; i {
p = Search(t, s[i]);
if (p != NULL)
{
dest += p->str;
//dest += ’ ’;
}
}
return dest;
}
//利用赫夫曼树对destCode进行解码
string Decode(string s, HuffmanTree hT)
{
string dest;
int p = 1;
int i = 0;
while (i < s.size())
{
while (hT[p].lc > 0)//非叶子结点
{
if (s[i++] == ’0’)
p = hT[p].lc; //向左结点前进
else
p = hT[p].rc; //向右结点前进
}
dest += hT[p].data; //存储叶子结点
p = 1;
}
return dest;
}
//销毁一棵二叉排序树
void DestroyBTree(Btree & t)
{
if (t福!= NULL)
{
DestroyBTree(t->lc);
DestroyBTree(t->rc);
delete t;
t = NULL;
}
}
//销毁一棵赫夫曼树
void DestroyHfmanTree(HuffmanTree & t, int n)
{
for (int i=n-1; i>=0; i--)
{
delete &t[i];
}
t = NULL;
}
八:程序找错 哈夫曼树的构建
编译问题改好了,逻辑上还有没有问题,你再看看:
#include
#define N 20/*叶子结点的最大值*/
#define M 2*N-1/*所有结点的最大值*/
typedef struct
{
int weight;/*结点的权值*/
int parent;/*双亲的下标*/
int LChild;//左孩子结点的下标*/
int RChild;/*右孩子结点的下标*/
}HTNode,HuffmanTree[M+1];/*HuffmanTree是结构数据组类型,0号单元不用*/
/*选出paeent为0且weight最小,次小的结点*/
select(HuffmanTree ht,int i,int *s1,int *s2) //Error: 这里不要分号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
int m,max=100000,max1=10000,n=0;//Error: n=0前面应该是逗号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for(m=1;m<=i-1;i++)//Error:i++前面应该是分号!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
/*求最小*/
while(ht[i].parent==0)
{
while(ht[m].weight { max=ht[m].weight; *s1=m;//Er户or:这里不是si,是s1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! } } /*求次小*/ while(ht[m].parent==0) //Error:这里不是paeent,是parent!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! { if(ht[m].weight { max1=ht[m].weight; *s2=m; } } } } /*哈夫曼树的构造*/ void CrtHuffmanTree(HuffmanTree ht,int w[],int n) {/*构造哈夫曼树ht[M+1],w[]存放n个权值*/ int i,m,s1,s2; for(i=1;i<=n;i++) //ht[i]={w[i],0,0,0}; //Error:结构体不能这么赋值!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! { ht[i].weight=w[i]; ht[i].parent=0; ht[i].LChild=0; ht[i].RChild=0;......余下全文>> //在吗? 我给你。另外我有自己的实验报告。 //里面有递归遍历,有迭代遍历。可以写文件,可以压缩编码。可以读文件。 //你不需要什么功能的话就删去相应的函数就行了。 //希望加分。 #include #include #include #include using namespace std; const int maxlen = 10000; //结点最大数目 const int maxlen2 = 260; //字符最大数目,叶节点最大数目 const int maxchar = 260; //字符最大数目 #define INTMAX 10000000; //大数,大于任意一个权值 struct CharSet //程序初始化时保存字符和结点的结构体。 { char ch; int weight; }; struct HaffNode //哈夫曼树结点结构 { int weight,parent,lchild,rchild; char ch; HaffNode() {weight=0; parent=lchild=rchild=-1; ch='\n';} }; struct HaffCode //哈夫曼树字符编码信息结构 { unsigned int bit; //通过位运算,用一个无符号整形来表示一串二进制编码。 int startb; //记录偏移量。 int weight; char ch; HaffCode() { bit=0; startb = -1; weight=0; ch='\n';} HaffCode& operator=(HaffCode & obj) //重载赋值符号 { bit=obj.bit; startb=obj.startb; ch=obj.ch; weight=obj.weight; return *this; } }; class HaffmanSystem { private: CharSet cs[maxlen/2]; //保存初始化时的字符和权值信息。 HaffNode hn[maxlen]; //保存哈夫曼树结点信息。 HaffCode hc[maxlen/2]; //保存哈夫曼树字符编码信息。 HaffCode hc2[maxchar]; //索引散列。考虑到字符数少,以字符的十进制数作为下标保存和索引字符编码信息,时间为O(1); int head; //根结点的数组下标。 int n; int leafnum; //叶节点个数,字符个数。 public: HaffmanSystem() {n=head=leafnum=0;} void Haffman(); &......余下全文>> #include #include #include #include #define OVERFLOW -1 typedef struct { char letter; int weight; int parent; int lchild; int rchild; }HTNode,*HuffmanTree; typedef char * *HuffmanCode; void Select(HuffmanTree &HT,int i,int &s1,int &s2) { /*选择森林中,根结点的权值最小和次小的两个树, *将其根结点的下标号记入s1和s2中 */ int j, k; for(k = 1; k < i; k++) { if(HT[k].parent != NULL) continue; s1 = k;/*init the number*/ break; } for(j = 1; j < i; j++) { if(HT[j].parent != NULL) continue; if(HT[j].weight < HT[s1].weight) s1 = j; } for(k = 1; k <= i; k++) { if(HT[k].parent != NULL || k == s1) continue; s2 = k; break; } for(j = 1; j < i; j++) { if(HT[j].parent != NULL) continue; if(HT[j].weight <= HT[s2].weight && j != s1) s2 = j; } } void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char *zi,int *w,int n) { HuffmanTree p; int m,i,s1,s2,f,c; int Istart = 1; char *cd; if(n <= 1) return; m = 2*n-1; if(!(HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)))) exit(OVERFLOW); for(p=HT+1,i=1;i<=n;++i,++zi,++p,++w) { /*生成独立的森林*/ p->parent = NULL; p->letter = *zi; p->lchild = NULL; p->rchild = NULL; p->weight = *w; } for(;i<=m;++i,++p) { (*p).weight=0; (*p).parent=0; (*p).lchild=0; (*p).rchild=0; } for(i=n+1;i<=m;++i) { Select(HT,i-1,s1,s2); HT[s1].parent=i; HT[s2].parent=i; ......余下全文>>九:1用递归实现二叉树的先序、中序、后序三种遍历。2哈夫曼树问题
十:对一串字符进行huffman编码并解码