《二叉树的基本操作》课程设计

上传人:无*** 文档编号:78961222 上传时间:2022-04-22 格式:DOC 页数:13 大小:723.07KB
收藏 版权申诉 举报 下载
《二叉树的基本操作》课程设计_第1页
第1页 / 共13页
《二叉树的基本操作》课程设计_第2页
第2页 / 共13页
《二叉树的基本操作》课程设计_第3页
第3页 / 共13页
资源描述:

《《二叉树的基本操作》课程设计》由会员分享,可在线阅读,更多相关《《二叉树的基本操作》课程设计(13页珍藏版)》请在装配图网上搜索。

1、 塔里木大学信息工程学院课程设计课程设计二叉树的基本操作课程设计论文学生姓名 学 号 所属学院 信息工程学院 专 业 计算机科学与技术 班 级 计算机 指导教师 教师职称 讲师 塔里木大学教务处制目录前言1正文12.1设计目的及意义12.2问题描述12.3 数据结构分析22.4算法设计及分析22.5算法测试及分析6总结7参考文献8附录91第 1页 共 13 页前言数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科。通过一学期的学习,对数据结构这门学科有了了解。为了检验这学期所学的知识,不光要通过考试,还要对其中的知识点进行深一步的了解探讨和研究。所以做这

2、个课程设计对知识点可以深度的研究。当数据的逻辑结构确定以后,数据在物理空间中的存储方式,称为数据的存储结构。同一逻辑结构可以具有不同的存储结构,因而有不同的算法。本次课程设计,程序中的数据采用“树形结构”作为其数据结构。具体采用的是二叉树。二叉树是树形结构的一个重要的类型,二叉树是n(n0)个结点的有限集,它或者是空集(n0),或者由一个根结点以及两棵互不相交的,分别称为左子树和右子树的二叉树组成。二叉树的顺序存储结构是把二叉树所有结点,按照一定的次序排序,存储到一片连续的存储单元中。但二叉树的顺序存储结构浪费空间并且插入、删除不方便。二叉树的链式存储每个结点至少包含三个域:数据域、左指针域、

3、右指针域,不浪费空间。二叉树的存储结构和算法比较简单,特别适合计算机处理,即使一般形式的树也可简单的转换为二叉树。现实中经常用到二叉树,因此本课程设计主要实现了二叉树的建立、三种遍历,计算二叉数的树深、统计叶子结点的个数等功能。正文2.1设计目的及意义课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力。2.2问题描述二叉树的很多操作都是基于遍历实现的。二叉树的遍历是采用某种策略使得采用树型结构组织的若干结点对应于一个线性序列。二叉树的遍历策略有四种先序遍历、中序遍历、后序遍历和层次遍历

4、。(1)按先序次序输入二叉树中结点的值,构造二叉链表表示的二叉树t;(2)对二叉树t作先序、中序、后序遍历的递归算法,输出结果;(3)计算二叉树t的深度,输出结果;(4)计算二叉树t的叶子结点个数2.3 数据结构分析本程序分为:7大模块。二叉树的建立链式存储结构、前序遍历、中序遍历、后序遍历、求叶子结点的个数计算、中序遍历、后序遍历、深度、主函数。1、二叉树的建立链式存储结构;首先typedef struct BiTNode:定义二叉树的链式存储结构,此处采用了每个结点中设置三个域,data:即值域,*lchild:左指针域和rchild:右指针域。2、二叉树的前序遍历;利用二叉链表作为存储结

5、构的前序遍历:先访问根结点,再依次访问左右子树。3、二叉树的中序遍历;利用二叉链表作为存储结构的中序遍历:先访问左子数,再访问根结点,最后访问右子树。4、二叉树的后序遍历;利用二叉链表作为存储结构的前序遍历:先访问左右子树,再访问根结点。5、求二叉树的深度:首先判断二叉树是否为空,若为空则此二叉树的深度为0。否则,就先别求出左右子树的深度并进行比较,取较大的+1就为二叉树的深度。6、二叉树的求叶子结点的个数计算;先分别求得左右子树中各叶子结点个数,再计算出两者之和即为二叉树的叶子结点数。7、主函数。主函数中分别调用各函数。2.4算法设计及分析算法流程图Main()CreateBiTree ()

6、构造二叉树PreOrderTraverse()NRPreOrder()分别输出递归与非递归先序遍历结果InOrderTrave()NRInOrder()分别输出中序递归与非递归遍历结果PostOrderTravesr()NRPostOrder()分别输出递归与非递归的后序遍历结果求结点的中序前驱后继中序InOrderTraver() 1、存储结构的建立由递归函数实现具体函数为:typedef struct bitnode telemtype data; struct bitnode *lchild,*rchild;bitnode ,*bitree;bitree createbitree(bit

7、ree t)char ch;scanf(%c,&ch);if(ch=#) t=NULL;elseif(!(t=(bitnode *)malloc(sizeof(bitnode) exit(overflow);t-data=ch;t-lchild=createbitree(t-lchild);t-rchild=createbitree(t-rchild);return t;在创建的二叉树中,左右孩子都为字符型。char的作用是输入n个任意的字符,而且在输入n个字符后,必须输入n+1个#,才能得到本程序所有能够实现的功能。t=Null是将二叉树置空。if(!(t=(bitnode *)malloc

8、(sizeof(bitnode),采用动态申请新结点的方式,不仅实现起来方便,而且还节省大量的存储空间。t-data=ch;值域t-lchild=createbitree(t-lchild);t-rchild=createbitree(t-rchild);将二叉树中的每一个结点设置为:值域,左指针域,右指针。这一小段程序实现了二叉树的置空,二叉树的建立,二叉树的存储。2、前序遍历:先访问根结点,再访问左子树,最后访问右子树。具体函数为:void preordertraverse(bitree t)if(t)printf(%c,t-data);preordertraverse(t-lchild)

9、;preordertraverse(t-rchild);3、中序遍历:先访问左子树,再访问根结点,最后访问右子树。具体函数为:void inordertraverse(bitree t) if (t) inordertraverse(t-lchild);printf(%c,t-data);inordertraverse(t-rchild); 4、后序遍历:先访问左子树,再访问右子树,最后访问根结点。具体函数为:void postordertraverse(bitree t) if(t)postordertraverse(t-lchild);postordertraverse(t-rchild)

10、;printf(%c,t-data); 5、求二叉树的深度:先定义三个整形变量m,n.如果树为空,则height=0;否则,先分别访问出左右子树的深度,再进行比较,将较大的+1的结果就是所求二叉树的深度。具体函数为:int height(bitree t)int m,n;if(t=NULL) return 0;else m=height(t-lchild);n=height(t-rchild);return (mn)?m+1:n+1;6、求叶子结点的个数:用leafcount变量表示叶子结点的总个数,用leafcount(t-lchild)、leafcount(t-rchild)分别表示访问的

11、左右子树中叶子结点的个数。当树为空是此时讨论叶子结点个数无意义;当树非空时分为:一、左右子数都不存在时,即叶子结点的个数为1;二、左右子树存在,就用分别访问出左右子树中叶子结点的个数,两者相加就为二叉树叶子结点的个数。具体函数为:int leafcount(bitree t) if(!t) return 0; /空数无叶子 else if(!t-lchild&!t-rchild) return 1; else return leafcount(t-lchild)+leafcount(t-rchild);7、主函数:包括:二叉树的数据结构bitree t、函数createbitree、heigh

12、t、leafcount、前序遍历preordertraverse、中序遍历inordertraverse、后序遍历postordertraverse。具体函数为:void main()bitree t;int w,v;printf(请输入建树字符序列:);t=createbitree(t);printf(先续遍历的结果是:);preordertraverse(t);printf(n);printf(中续遍历的结果是:);inordertraverse(t);printf(n);printf(后续遍历的结果是:);postordertraverse(t);printf(n);printf(二叉树

13、的深度是:);w=height(t);printf(%dn,w);printf(二叉树的叶子结点的数目为:);v=leafcount(t);printf(%d,v);printf(n);2.5算法测试及分析建立一个二叉树 遍历二叉树结点求二叉树所有结点数总结通过对二叉树的基本操作的学习,熟悉的掌握了二叉树的结构特性,掌握了二叉树的链式存储结构的特点和适用范围,通过二叉树的基本操作实现,思考一般树的基本操作的实现。熟悉掌握各种遍历各种二叉树的策略的递归和非递归算法。在对二叉树基本操作的学习过程中不断对其中的算法思想进行改进和修正,更熟悉的掌握关于二叉树的基本操作. 熟练掌握二叉树的结构特性,了解

14、相应的证明方法。 熟悉二叉树的各种存储结构的特点及适用范围。 遍历二叉树是二叉树各种操作的基础。实现二叉树遍历的具体算法与所采用的存储结构有关。不仅要熟练掌握各种遍历策略的递归和非速归算法,了解遍历过程中 栈 的作用和状态,而且能灵活运用遍历算法实现二叉树的其它操作。层次遍历是按另一种搜索策略进行的遍历。 理解二叉树线索化的实质是建立结点与其在相应序列中的前驱或后继之间的直接联系,熟练掌握二叉树的线索化过程以及在中序线索化树上找给定结点的前驱和后继的方法。二叉树的线索化过程是基于对二叉树进行遍历,而线索二叉树上的线索又为相应的遍历提供了方便。 熟悉树的各种存储结构及其特点,掌握树和森林与二叉树

15、的转换方法。建立存储结构是进行其它操作的前提,因此读者应掌握 1 至 2 种建立二叉树和树的存储结构的方法。学会编写实现树的各种操作的算法。 了解最优树的特性,掌握建立最优树和哈夫曼编码的方法。 理解前序序列和中序序列可唯一确定一棵二叉树的道理,理解具有相同的前序序列而中序序列不同的二叉树的数目与序列 12n 按不同顺序进栈和出栈所能得到的排列的数目相等的道理,掌握由前序序列和中序序列建立二叉树的存储结构的方法。参考文献1 严蔚敏,吴伟民.数据结构(C语言版).第1版.北京;清华大学出版社,2005年;58-64.2 严蔚敏,吴伟民.数据结构题集(C语言版).第1版.北京;清华大学出版社,20

16、05年;96-105.3 李春葆,章启俊.C+程序设计.第1版.北京;清华大学出版社,2007年;56-31.4 谭浩强.C程序设计(第二版).第6版.北京;清华大学出版社,2004年;9-15.5 陈一华等编.数据结构-使用C 语言.第一版.北京;电子科技大学出版社,1998年;12-14.6 许卓群数据结构第一版. 北京;高等教育出版社,1989年;14-18.7 严蔚敏,吴伟民数据结构题集(C语言版)第一版. 北京;清华大学出版社,1999;3-10.8 蔡明志数据结构(使用C语言)第二版. 北京;科学出版社,1997年;12-15.9 蔡自经,施伯乐数据结构教程第二版. 上海;复旦大学

17、出版社,1984年,11-14.附录源代码:#include #include #include #define ok 1#define error 0#define overflow -1typedef char telemtype;typedef struct bitnode telemtype data; struct bitnode *lchild,*rchild;bitnode ,*bitree;bitree createbitree(bitree t)char ch;scanf(%c,&ch);if(ch=#) t=NULL;elseif(!(t=(bitnode *)malloc

18、(sizeof(bitnode) exit(overflow);t-data=ch;t-lchild=createbitree(t-lchild);t-rchild=createbitree(t-rchild);return t; void preordertraverse(bitree t) if(t)printf(%c,t-data);preordertraverse(t-lchild);preordertraverse(t-rchild); void inordertraverse(bitree t)if (t) inordertraverse(t-lchild);printf(%c,t

19、-data);inordertraverse(t-rchild); void postordertraverse(bitree t) if(t)postordertraverse(t-lchild);postordertraverse(t-rchild);printf(%c,t-data); int height(bitree t)int m,n;if(t=NULL) return 0;else m=height(t-lchild);n=height(t-rchild);return (mn)?m+1:n+1;int leafcount(bitree t)if(!t) return 0; /空

20、数无叶子else if(!t-lchild&!t-rchild) return 1;else return leafcount(t-lchild)+leafcount(t-rchild); void main()bitree t;int w,v;printf(请输入建树字符序列:);t=createbitree(t);printf(先续遍历的结果是:);preordertraverse(t);printf(n);printf(中续遍历的结果是:);inordertraverse(t);printf(n);printf(后续遍历的结果是:);postordertraverse(t);printf(n);printf(二叉树的深度是:);w=height(t);printf(%dn,w);printf(二叉树的叶子结点的数目为:);v=leafcount(t);printf(%d,v);printf(n);10第 10页 共12 页

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!