数据结构 - 树和二叉树的基本运算实现
2016-06-21 23:06
381 查看
实验题目
设计一个程序exp7-6.cpp,构造一棵哈夫曼树,输出对应的哈夫曼编码和平均查找长度。并用表7.8所示的数据进行验证。实验目的
掌握哈夫曼树的构造过程和哈夫曼编码的产生方法;灵活运用二叉树这种数据结构解决一些综合应用问题。源码:
#include <iostream> #include <cstring> #define N 50 #define M 2*N-1 using namespace std; struct HTNode { char data[5]; //节点值 int weight; int parent; int lchild; int rchild; }; struct HCode { char cd ; //存放哈夫曼码 int start; }; void CreateHT(HTNode ht[],int n) { int i,k,lnode,rnode; int min1,min2; for (i=0;i<2*n-1;i++) ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for (i=n;i<2*n-1;i++) { min1=min2=32767; lnode=rnode=-1; for (k=0;k<=i-1;k++) if (ht[k].parent==-1) { if (ht[k].weight<min1) { min2=min1;rnode=lnode; min1=ht[k].weight;lnode=k; } else if (ht[k].weight<min2) { min2=ht[k].weight;rnode=k; } } ht[lnode].parent=i;ht[rnode].parent=i; ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode;ht[i].rchild=rnode; } } void CreateHCode(HTNode ht[],HCode hcd[],int n) { int i,f,c; HCode hc; for (i=0;i<n;i++) { hc.start=n;c=i; f=ht[i].parent; while (f!=-1) { if (ht[f].lchild==c) hc.cd[hc.start--]='0'; else hc.cd[hc.start--]='1'; c=f;f=ht[f].parent; } hc.start++; hcd[i]=hc; } } void DispHCode(HTNode ht[],HCode hcd[],int n) { int i,k; int sum=0,m=0,j; cout<<"输出哈夫曼编码:"<<endl; for (i=0;i<n;i++) { j=0; cout<<ht[i].data<<":"; for (k=hcd[i].start;k<=n;k++) { cout<<hcd[i].cd[k]; j++; } m+=ht[i].weight; sum+=ht[i].weight*j; cout<<endl; } cout<<"平均长度="<<1.0*sum/m<<endl;; } int main() { int n=15,i; char *str[]={"The","of","a","to","and","in","that","he","is","at","on","for","His","are","be"}; int fnum[]={1192,677,541,518,462,450,242,195,190,181,174,157,138,124,123}; HTNode ht[M]; HCode hcd ; for (i=0;i<n;i++) { strcpy(ht[i].data,str[i]); ht[i].weight=fnum[i]; } CreateHT(ht,n); CreateHCode(ht,hcd,n); DispHCode(ht,hcd,n); }
运行结果:
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- ASP编码必备的8条原则
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- XML指南——XML编码
- C#中字符串编码处理
- ExtJS中文乱码之GBK格式编码解决方案及代码
- 程序员趣味读物 谈谈Unicode编码
- 文本文件编码方式区别
- 数据结构之Treap详解
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- C语言安全编码之数值中的sizeof操作符
- C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式