




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、福州大学数计学院数据结构上机实验报告专业:信息数学学号031201206姓名詹小青班级02班实验名称树与二叉树实验实验内容树型结构及其应用实验目的和要求【背景知识】二叉树的存储、建立、遍历及其应用。【目的要求】1掌握二叉树的存储实现。 2掌握二叉树的遍历思想。 3掌握二叉树的常见算法的程序实现。【实验主要内容】运用树的结构来实现建树、遍历等算法,并能运用,如哈夫曼问题的设计。问题描述和主要步骤1、以二叉链表方式建立二叉树,并任选一种遍历方式输出结点的值【实验目的】(1)了解二叉树的结构特点及有关概念,掌握二叉树建立的基本算法; (2)了解二叉树遍历的概念,掌握遍历二叉的算法。【实验内容】按层次
2、序依次输入元素值,以链表方式建立该二叉树,然后可依据先序、中序、后序中的任一种遍历方法遍历二叉树的方式输出结点的值。2、哈夫曼编码【实验目的】了解赫夫曼树的结构特点及有关概念,掌握赫夫曼树的建立和赫夫曼编码的设计【问题描述】使用二叉树进行赫夫曼编码的设计,要求对输入的一串电文字符实现赫夫曼编码,再对赫夫编码生成的代码串进行译码,输出电文字符串【实验功能】1、 赫夫曼树的建立:从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmtree中;2、 赫夫曼编码的生成:利用以建好的赫夫曼树,对报文文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中;
3、3、 编码文件的译码:利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。实验结果(截图表示)1、以二叉链表方式建立二叉树,并任选一种遍历方式输出结点的值程序:#include#include#define Maxsize 100typedef struct TREEstruct TREE *lTree;struct TREE *rTree;char data;Tree;void InitTree(Tree*);/初始化树void CreatTree(Tree*);/创建二叉树void PreTraverse(Tree*);/先序遍历递归void Pre
4、OrderTraverse(Tree*);/先序遍历非递归void InTraverse(Tree *tree);/中序遍历递归void InOrderTraverse(Tree *tree);/中序遍历非递归void PostTraverse(Tree *tree);/后序遍历递归void LastOrderTraverse(Tree *tree);/后序遍历非递归int DepthTree(Tree *tree);/计算树的深度int LeafsTree(Tree *tree);/计算叶子结点个数int NodesTree(Tree *tree);/计算结点个数int Twochild(T
5、ree*tree);/计算度为二的结点个数void main()int H,L;Tree tree;Tree m;InitTree(&tree);CreatTree(&tree);cout先序遍历递归为:;PreTraverse(&tree);/先序遍历递归cout先序遍历非递归:;PreOrderTraverse(&tree);/先序遍历非递归coutendl;cout中序遍历递归为:;InTraverse(&tree);/中序遍历递归cout中序遍历非递归:;InOrderTraverse(&tree);/中序遍历非递归coutendl;cout后序遍历递归为:;PostTraverse(
6、&tree);/后序遍历递归cout后序遍历非递归:;LastOrderTraverse(&tree);/后序遍历非递归coutendl; cout树的深度为:; H=DepthTree(&tree);coutHendl;cout叶子结点个数:;L=LeafsTree(&tree); coutLendl;cout结点个数:;coutNodesTree(&tree)endl;cout度为二的结点个数;L=Twochild(&tree);coutLlTree=NULL;tree-rTree=NULL;tree-data=0;void CreatTree(Tree *tree)/创建树int n=0
7、,m=0,i=0;if(tree-data=0)couttree-data;cout节点datan;if(n=1)Tree *lTree=(Tree*)malloc(sizeof(Tree);tree-lTree=lTree;lTree-lTree=NULL;lTree-rTree=NULL;lTree-data=0;CreatTree(tree-lTree);cout节点datai;if(i=0);else if(i=1)Tree *rTree=(Tree*)malloc(sizeof(Tree);tree-rTree=rTree;rTree-lTree=NULL;rTree-rTree=N
8、ULL;rTree-data=0;CreatTree(tree-rTree);else if(n=0)cout节点datam; if(m=0);else if(m=1)Tree *rTree=(Tree*)malloc(sizeof(Tree);tree-rTree=rTree;rTree-lTree=NULL;rTree-rTree=NULL;rTree-data=0;CreatTree(tree-rTree);void PreTraverse(Tree*tree)/先序遍历递归if(tree!=NULL)coutdatalTree!=NULL)PreTraverse(tree-lTree)
9、;PreTraverse(tree-rTree);else if(tree-rTree!=NULL)PreTraverse(tree-rTree);else;void PreOrderTraverse(Tree *tree)/先序遍历非递归Tree *S80=NULL;int top =0;while (tree!=NULL)|(top)if (tree!=NULL)coutdatalTree;elsetree = Stop;top-;tree = tree-rTree;void InTraverse(Tree *tree)/中序遍历递归if(tree!=NULL)if(tree-lTree!
10、=NULL)InTraverse(tree-lTree);coutdatarTree);else if(tree-rTree!=NULL)coutdatarTree);elsecoutdatalTree;elsetree = Dtop;top-;coutdatarTree;void PostTraverse(Tree *tree)/后序遍历递归if(tree!=NULL)if(tree-lTree!=NULL)PostTraverse(tree-lTree);PostTraverse(tree-rTree);coutdatarTree!=NULL)PostTraverse(tree-rTree
11、);coutdata ;elsecoutdatalTree;if(top!=0)p=stacktop-rTree;if(p=NULL)coutdatarTree!=NULL)if(stacktop-rTree-data=stacktop+1-data)coutdatarTree;elsep=NULL;int DepthTree(Tree *tree) /深度函数 int u,v; if (tree=NULL) return 0; u=DepthTree(tree-lTree); v=DepthTree(tree-rTree); if (uv) return (u+1); return (v+1
12、); int LeafsTree(Tree *tree)/子叶个数函数 int num1,num2; if(tree=NULL) return 0; else if(tree-lTree=NULL&tree-rTree=NULL) return 1; else num1=LeafsTree(tree-lTree); num2=LeafsTree(tree-rTree); return(num1+num2); int NodesTree(Tree *tree)/结点个数函数 int num1,num2; if(tree=NULL) return 0; if(tree-lTree=NULL&tre
13、e-rTree=NULL) return 1; else num1=NodesTree(tree-lTree); num2=NodesTree(tree-rTree); return(num1+num2+1); int Twochild(Tree*tree)/度为2的 int n=0; if(tree=NULL) return(0); if(tree-lTree!=NULL&tree-rTree!=NULL) n=1; return(Twochild(tree-lTree)+Twochild(tree-rTree)+n); 实验结果截图:2、哈夫曼编码程序:#include #include
14、#include #define MAXLEN 100typedef struct int weight; int lchild; int rchild; int parent; char key;htnode;typedef htnode hfmtMAXLEN;int n;void inithfmt(hfmt t)/对结构体进行初始化 int i; printf(n); printf(-n); printf(*输入区*n); printf(n请输入n=); scanf(%d,&n); getchar(); for(i=0;i2*n-1;i+)/对结构体进行初始化 ti.weight=0; t
15、i.lchild=-1; ti.rchild=-1; ti.parent=-1; printf(n); void inputweight(hfmt t)/输入函数 int w;/w表示权值 int i; char k;/k表示获取的字符 for(i=0;in;i+) printf(请输入第%d个字符:,i+1); scanf(%c,&k); getchar(); ti.key=k; printf(请输入第%d个字符的权值:,i+1); scanf(%d,&w); getchar(); ti.weight=w; printf(n); void selectmin(hfmt t,int i,int
16、 *p1,int *p2)/选中两个权值最小的函数 long min1=999999; long min2=999999; int j; for(j=0;jtj.weight) min1=tj.weight; *p1=j; for(j=0;jtj.weight & j!=(*p1)/注意 j!=(*p1) min2=tj.weight; *p2=j; void creathfmt(hfmt t)/创建哈夫曼树的函数 int i,p1,p2; inithfmt(t); inputweight(t); for(i=n;i2*n-1;i+) selectmin(t,i-1,&p1,&p2); tp1
17、.parent=i; tp2.parent=i; ti.lchild=p1; ti.rchild=p2; ti.weight=tp1.weight+tp2.weight; void printhfmt(hfmt t)/打印哈夫曼树 int i; printf(-n); printf(*哈夫曼编数结构:*n); printf(tt权重t父母t左孩子t右孩子t字符t); for(i=0;i2*n-1;i+) printf(n); printf(tt%dt%dt%dt%dt%c,ti.weight,ti.parent,ti.lchild,ti.rchild,ti.key); printf(n-n);
18、 printf(nn); void hfmtpath(hfmt t,int i,int j)/编码的重要哈夫曼树路径递归算法 int a,b; a=i; b=j=ti.parent; if(tj.parent!=-1) i=j; hfmtpath(t,i,j); if(tb.lchild=a) printf(0); else printf(1); void phfmnode(hfmt t)/对字符进行初始编码 int i,j,a; printf(n-n); printf(*哈夫曼编码*); for(i=0;in;i+) j=0; printf(n); printf(tt%ct,ti.key,t
19、i.weight); hfmtpath(t,i,j); printf(n-n); void encoding(hfmt t)/对用户输入的电文进行编码 char r1000;/用来存储输入的字符串 int i,j; printf(nn请输入需要编码的字符:); gets(r); printf(编码结果为:); for(j=0;rj!=0;j+) for(i=0;in;i+) if(rj=ti.key) hfmtpath(t,i,j); printf(n); void decoding(hfmt t)/对用户输入的密文进行译码 char r100; int i,j,len; j=2*n-2;/j初始从树的根节点开始 printf(nn请输入需要译码的字符串:); gets(r); len=strlen(r); printf(译码的结果是:); for(i=0;ilen;i+) if(ri=0) j=tj.lchild; if(tj.lchild=-1) printf(%c,tj.key); j=2*n-2; else if(ri=1) j=tj.rchild; if(tj.rchild=-1) printf(%c,tj.key); j=2*n-2; printf(nn); int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年福州市长乐生态环境局招聘2人模拟试卷带答案详解
- 2025北京林业大学附属实验小学招聘1人考前自测高频考点模拟试题及答案详解(名师系列)
- 2025广东广州市越秀区人民法院合同制司法警察辅助人员岗位拟聘用人员考前自测高频考点模拟试题及1套参考答案详解
- 2025鲁控环保科技有限公司招聘20人(山东)模拟试卷及答案详解参考
- 2025年台州市黄岩区公开选调9名公务员模拟试卷附答案详解(模拟题)
- 2025年威海市环翠区教育和体育局公开招聘中小学教师(53人)模拟试卷(含答案详解)
- 2025年福建省厦门中烟益升华滤嘴棒有限责任公司招聘12人模拟试卷及答案详解(有一套)
- 2025年中国化妆品用胭脂虫提取物行业市场分析及投资价值评估前景预测报告
- 2025年宿州市中医医院招聘36人考前自测高频考点模拟试题及答案详解(典优)
- 2025年哈尔滨市南岗区人民医院招聘3人模拟试卷及答案详解(夺冠)
- 保温人员安全培训课件
- 驾校教练安全知识培训课件
- 本科教学审核评估汇报
- 《直线方程的两点式》教学设计
- 01 华为采购管理架构(20P)
- 望洞庭教学课件
- 都江堰水利工程课件
- 液氮运输投标方案(3篇)
- 《2019年甘肃省职业院校技能大赛学前教育专业教育技能赛项竞赛规程(高职教师组)》
- 《智能制造技术与工程应用》全套教学课件
- TSG T5002-2017 电梯维护保养规则
评论
0/150
提交评论