




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验四 树和二叉树的操作一、实验题目:用菜单驱动的手法,编写一个完整的程序,生成一棵二叉树,求二叉树的高度,求二叉树的叶子结点数,输出二叉树的所有结点。二、实验算法描述:二叉树的生成是指如何在内存中建立二叉树的存储结构。建立顺序存储结构的问题较简单,这里仅讨论如何建立二叉链表。要建立二叉链表,就需要按照某种方式输人二叉树的结点及其逻辑信息。注意到对二叉树遍历时,不仅得到了结点信息,而且由序列中结点的先后关系还可获得一定的逻辑信息,如果这些信息足够,就可根据遍历序列生成相应的二叉树二叉树的生成方法就是基于遍历序列的,相当于遍历问题的逆问题,即由遍历序列反求二叉树,这需要分析和利用二叉树遍历序列的特点。在下列两种方法中任选一种。*以下的(一)(二)要编写在一个完整的程序中。如果你不能编在一个程序中,则可以用两个完整的程序来实现。(一)用先根序列建立二叉树二叉树的结点就按相应的遍历过程逐个生成。类似层次遍历,如果不对遍历序列作些补充,是不能完整反映结点间的逻辑关系的,也就不能得到正确的结果。补充的方法也是增加虚结点,但这里只需对空指针对应的位置进行补充,而不必补充到完全二叉树的形式。以先根遍历上图为例,二叉树的先根输入序列为:ABDGCEFH其中表示虚结点,这里不需要结束符。算法过程为,先生成根结点,再生成左子树,然后是右子树,左右子树的生成采用递归。在具体作本实验时,还需编写一个主函数调用这个函数来生成二叉树,最后输出二叉树的结点序列。(二)按完全二叉树的层次顺序,依次输入结点信息来建立二叉链表这是因为完全三叉树的层次遍历序列中,结点间的序号关系可反映父子关系即逻辑关系。对一般的二又树,要补充若干个虚结点使其成为完全二叉树后,冉按其层次顺序输入。例如,仅含3个结点A、B、C的右单支树(见下图 2),按完全二叉树的形式输入的结点序列为:ABC,其中表示虚结点,表示输入结束。算法的基本思想是:依次输入结点信息,若输入的结点不是虚结点,则建立一个新结点:若新结点是第1个结点,则令其为根结点;否则将新结点作为孩子链接到它的双亲结点上。如此重复下去,直至输入字符“”为止。 这里的关键是新结点与其双亲的链接。由于是按层次自左至右输入结点的,所以先输入的结点,其孩子也必定较先输入。即结点与其孩子具有先进先出的特点,于是可设置一个队列,保存已输人结点的地址。这样,队尾是当前正输入的结点,队头是其双亲结点。当队头结点的两个孩子都输入完毕后,出队,新的队头是下一个要输入孩子的双亲结点。如此下去,直到输入结束符为止。双亲与孩子的链接方法是:若当前输入的结点编号是偶数,则该结点作为左孩子与其双亲链接;否则作为右孩子与其双亲链。若双亲结点或孩子结点为虚结点,则无需链接。实验程序如下:#include#include#include#includeint cmp(const void *a,const void *b)return *(int *)a-*(int *)b;typedef char datatype;typedef struct treenodedatatype data; struct treenode *leftchild,*rightchild;treenode,*bitree;treenode *t;int count=0;/建立二叉树方法1treenode *creattree_1() treenode *t,*p,*v100;int i,j;datatype e;t=NULL; printf(n请输入初始二叉树各结点的编号和对应的值(如1,a):); scanf(%d,%c,&i,&e); while(i!=0&e!=#) p=(treenode *)malloc(sizeof(treenode); p-data=e;p-leftchild=NULL;p-rightchild=NULL; vi=p; if(i=1) t=p; else j=i/2; if(i%2=0) vj-leftchild=p; else vj-rightchild=p; printf(n请继续输入(以0,#结束):); scanf(%d,%c,&i,&e); return (t);/建立二叉树方法2treenode *creattree_2() treenode *t;datatype e; scanf(%c,&e); if(e=#) t=NULL; else t=(treenode *)malloc(sizeof(treenode); t-data=e; t-leftchild=creattree_2(); t-rightchild=creattree_2(); return (t);/先序遍历输出二叉树void preorder(treenode *p) if(p) printf(%-4c,p-data); preorder(p-leftchild); preorder(p-rightchild); /中序遍历输出二叉树void inorder(treenode *p) if(p) inorder(p-leftchild); printf(%-4c,p-data); inorder(p-rightchild); /后序遍历输出二叉树void postorder(treenode *p)if(p) postorder(p-leftchild); postorder(p-rightchild); printf(%-4c,p-data); /计算二叉树高度int treedepth(bitree bt) int lefthight,righthight,max; if(bt!=NULL) lefthight=treedepth(bt-leftchild); righthight=treedepth(bt-rightchild); max=(lefthightrighthight)?lefthight:righthight; return(max+1); else return (0); /逆时针旋转90度输出二叉树void printtree(bitree bt,int level) int j; if(bt) printtree(bt-rightchild,level+1); for(j=0;jdata); printtree(bt-leftchild,level+1); /交换二叉树左右子树void exchange(bitree bt) bitree p; if(bt) p=bt-leftchild;bt-leftchild=bt-rightchild;bt-rightchild=p; exchange(bt-leftchild); exchange(bt-rightchild); /计算叶结点数int leafcount(bitree bt) if(bt!=NULL) leafcount(bt-leftchild); leafcount(bt-rightchild); if(bt-leftchild=NULL)&(bt-rightchild=NULL) count+; return (count);/输出叶结点void paintleaf(bitree bt) if(bt!=NULL)if(bt-leftchild=NULL&bt-rightchild=NULL) printf(%-4c,bt-data);paintleaf(bt-leftchild); paintleaf(bt-rightchild);/哈夫曼树int haffman()int a100,b100;int i,j=0,k,n;memset(a,0,100);memset(b,0,100);printf(请输入构造哈夫曼树的元素个数(正整数):);scanf(%d,&n);printf(n);printf(请依次输入各元素权值(以空格间隔,按ENTER键结束):n); for(i=0;in;i+) scanf(%d,&ai);printf(n);getchar();printf(构造哈夫曼树过程:nn); for(i=0;in;i+) qsort(a,n,sizeof(a0),cmp); printf(步骤(%d),i+1); for(k=i;kn;k+) printf(%d ,ak); printf(nn); bj+=ai; bj+=ai+1; ai+1=ai+ai+1; printf(当前哈夫曼树的所有结点权值为:n); for(i=0;ij-1;i+) printf(%-5d,bi); printf(nn);int main()int command;char order; doprintf(=简单二叉树操作菜单=n) ; printf(* 1.建立二叉树(按照完全二叉树) *n); printf(* 2.建立二叉树(模仿先序递归遍历) *n); printf(* 3.先序递归遍历二叉树 *n); printf(* 4.中序递归遍历二叉树 *n); printf(* 5.后序递归遍历二叉树 *n); printf(* 6.输出二叉树的高度 *n); printf(* 7.输出二叉树的叶结点 *n); printf(* 8.交换二叉树的左右子树 *n); printf(* 9.打印二叉树 *n); printf(* 10.哈夫曼树(最优二叉树) *n); printf(* 0.退出 *n); printf(=nn); printf(请输入指令(0,1,2,3,4,5,6,7,8,9,10):);scanf(%d,&command);if(command10)getchar(); system(cls);printf(n指令输入错误!请重新输入!n); switch(command) case 1: getchar(); system(cls); printf(若已构建二叉树,此操作将会清除当前二叉树,继续/退出Y/N:); scanf(%c,&order) ; if(order=Y|order=y) t=creattree_1(); if(t) printf(n当前二叉树为(逆时针旋转90度):n); printtree(t,0); printf(n); else printf(n当前二叉树为空!请先建立二叉树!n); getchar(); break; elsebreak; case 2: getchar(); system(cls); printf(若已构建二叉树,此操作将会清除当前二叉树,继续/退出Y/N:); scanf(%c,&order) ; if(order=Y|order=y) printf(n请输入二叉树按先序递归遍历各结点的值(虚结点以#代替):n); fflush(stdin); t=creattree_2(); if(t) printf(n当前二叉树为(逆时针旋转90度):n); printtree(t,0); printf(n); else printf(n当前二叉树为空!请先建立二叉树!n); getchar(); break; elsebreak; case 3: getchar(); system(cls);if(t) printf(n当前二叉树为(逆时针旋转90度):n);printtree(t,0); printf(n); printf(n先序递归遍历序列为:n); preorder(t); printf(n); else printf(n二叉树为空!请先建立二叉树!n); break; case 4: getchar(); system(cls);if(t) printf(n当前二叉树为(逆时针旋转90度):n);printtree(t,0); printf(n); printf(n中序递归遍历序列为:n); inorder(t); printf(n); else printf(n二叉树为空!请先建立二叉树!n); break; case 5: getchar(); system(cls);if(t) printf(n当前二叉树为(逆时针旋转90度):n);printtree(t,0); printf(n); printf(n后序递归遍历序列为:n);postorder(t);printf(n);else printf(n二叉树为空!请先建立二叉树!n);break;case 6:getchar(); system(cls);if(t)printf(n当前二叉树为(逆时针旋转90度):n);printtree(t,0); printf(n); printf(当前二叉树的高度为:%dn,treedepth(t); elseprintf(n二叉树为空!请先建立二叉树!n);break;case 7:getchar(); system(cls);if(t)printf(n当前二叉树为(逆时针旋转90度):n);printtree(t,0); printf(n); printf(当前二叉树的叶子结点数为:%dnn,leafcount
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 爬架安全专业试题及答案
- 口腔专业基础试题及答案
- 卫生应急专业试题及答案
- 湖北省孝感市2025-2026学年高二上学期9月起点考试物理试卷(含答案)
- 黑龙江省大庆市2025-2026学年高三第一次教学质量检测数学试题(含答案)
- 专业级试题及答案
- 历史专业期末试题及答案
- 广东省2025-2026年高三上9月月考历史试卷(含答案)
- 福建省泉州市安溪县2024-2025学年高二上学期11月期中考试化学试卷(含答案)
- 龙岗玻璃锁施工方案
- 信息检索技术讲义
- 商业银行基于华为OceanStor的关键业务同城切换方案
- 火力发电厂运煤设计规程
- 第十章DNA、RNA的生物合成ppt课件
- 3250变压器综合测试仪(共85页)
- 中国联通VI手册完整版
- 昆虫分类检索表
- 贾谊《鵩鸟赋》课件,《鵩鸟赋》讲解
- 翻转课堂视域下“导学案”的设计研究课题评审书
- HXN5型机车常见故障处理指导书
- 物理化学 第四章 第三节 完全互溶双液体系
评论
0/150
提交评论