




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
长春建筑学院数据结构课程设计(论文) 基于二叉树遍历系统设计与实现基于二叉树遍历系统设计与实现 binary tree traversal system design and implementation 年 级: 学 号: 姓 名: 专 业: 指导老师: 二零一三年十二月 长春建筑学院数据结构课程设计(论文) i 摘 要 针对现实世界中许多关系复杂的数据,如人类社会的家谱,各种社会组织机构, 博弈交通等复杂事物或过程以及客观世界中广泛存在的具有分支关系或层次特性的 对象如操作系统的文件构成、人工智能和算法分析的模型表示以及数据库系统的 信息组织形式等,用线性结构难以把其中的逻辑关系表达出来,必须借助于数和图 这样的非线性结构,因此在以模拟客观世界问题,解决客观世界问题为主要任务的 计算机领域中树型结构是信息的一种重要组织形式,树有着广泛应用。在树型结构 的应用中又以二叉树最为常用。 二叉树是一种非常重要的非线性结构,所描述的数据有明显的层次关系,其中 的每个元素只有一个前驱,二叉树是最为常用的数据结构,它的实际应用非常广泛, 二叉树的遍历方式有三种,前序遍历,中序遍历,后序遍历,先序遍历的顺序为: nlr 先根结点,然后左子树,右子树;中序遍历顺序为;lnr 先左子树,然后根结点, 右子树;后序遍历顺序为:lrn 先左子树,然后右子树,根结点。由前序和中序遍 历,有中序和后序遍历序列可以唯一确定一棵二叉树。 对于给几个数据的排序或在已知的几个数据中进行查找,二叉树均能提供一种 十分有效的方法,比如在查找问题上,任何借助于比较法查找长度为的一个序表 的算法,都可以表示成一株二叉树。反之,任何二叉树都对应一个查找有序表的有 效方法根据树的数学理论,对于算法分析的某些最有启发性的应用,是与给出用于 计算各种类型中不同树的数目的公式有关的。 本文对二叉树以及二叉树的各种功能做介绍以及写出一些基本的程序,让读者 对二叉树的理解有更好的效果。 关键词:二叉树; 左子树; 右子树 长春建筑学院数据结构课程设计(论文) ii abstract in many real world of complex data, such as the human society family, social organization, widespread game traffic complex thing or process and the objective world with a branch or level characteristics of the object. if the operating system file analysis, artificial intelligence and algorithm model representation and database information system the form of organization, with a linear structure to express the logic relationship among them, must depend on the number and the diagram of such nonlinear structure, so in order to simulate the objective world, solve problems as the main task of the computer field in the tree structure is an important organization form of information, the tree has a broad application. in the application of tree structure in which the two fork tree is the most commonly used. two binary tree is a kind of very important nonlinear structure, hiberarchy description of the data, where each element is only a precursor, two fork tree is the most commonly used data structure, its application is very extensive, there are three kinds of two binary tree traversal, preorder traversal, in the traversal, postorder traversal, preorder traversal sequence: nlr to the root node, and then the left subtree, right subtree; in order traversal sequence; lnr before the left sub tree, then the root node, the right subtree; after the traversal order: lrn first and then the left subtree, right subtree, root node. by preorder traversal and traversal, with the order and post order traversal sequence can be uniquely identified a two binary tree. for several data sorting or searching in several data known, two fork tree can provide a very effective method, such as search problems, any by the comparison method to find the length of a sequential algorithm of table iv, can be expressed as a two fork tree. conversely, any two fork tree corresponds to an effective method to find the ordered list according to the mathematical theory of tree, for some algorithm analysis of the application of heuristic, is given for the number and different types of tree calculation formula. various functions of two binary tree and binary tree in this paper two introduces and write some of the basic procedures, to allow readers to understand the two fork tree has a better effect. keywords:two tree; the left subtree; right subtree 长春建筑学院数据结构课程设计(论文) 目 录 摘 要 i abstract. 第 1 章 绪 论1 1.1 设计目的1 1.2 设计内容1 1.3 设计要求1 1.4 设计思想2 1.5 系统模块划分2 1.6 主要功能模块设计2 第 2 章 系统总体设计3 2.1 基本理论.3 2.2 概要设计.3 第 3 章 详细设计4 3.1 建立二叉树.4 3.2 二叉树的层次遍历和中序遍历.4 3.3 求二叉树的深度.7 3.4 将二叉树中所有结点的左右子树相互交换.7 3.5 求二叉树中叶子结点的数目.9 第 4 章 流程分析图11 4.1 流程图.11 4.2 主要功能模块设计.11 4.3 模块设计.12 4.4 函数主要调用关系图.13 第 5 章 系统测试14 5.1 调试分析.14 5.2 实验结果.15 结 论17 致 谢18 参考文献18 长春建筑学院数据结构课程设计(论文) - 1 - 第 1 章 绪 论 引言:引言: 树型结构是一类重要的非线性数据结构,其中一树和二叉树最重要。树结构在 客观世界中广泛存在,如人类社会的族谱和各种社会组织机构够可以用树来形象表 示。树在计算机领域中也得到了广泛应用,如在编译程序中,可以用树来表示源程 序的语法结构。二叉树是一种非线性数据结构,对它进行操作时总需要对每个数据 逐一进行操作,这样就存在一个操作顺序问题,由此提出了二叉树的遍历操作问题, 所谓遍历二叉树就是按某种顺序访问二叉树中某个结点一次且仅一次的过程,这里 的访问可以是输出.比较.更新.查看元素内容等各种操作。 1.1 设计目的 1.掌握二叉树结点结构的建立。 2.掌握先序、中序和后序遍历的基本操作。 1.2 设计内容 利用二叉树特点和功能实现先序、中序和后序遍历系统的实现,具体功能:输 入、输出遍历结果、先序遍历、中序遍历和后序遍历,并能在屏幕上输出操作前后 的结果。 1.3 设计要求 1.写出系统需求分析,并建模。 2.编程实现,界面友好。 3.输出操作前后的结果。 4.提供测试报告。 长春建筑学院数据结构课程设计(论文) - 2 - 1.41.4 设计思想设计思想 1.建立二叉树采用一个一个输入的方式。 2.对二叉树进中序遍历采用递归函数和非递归函数分别实现多种遍历的方式。另 外还有层次遍历,来充分实现本书对树的遍历。 3.删除结点函数,采用边查找边删除的方式。如果没有查找到,则不对树做任何 的修改;如果查找到结点则删除。 1.51.5 系统模块划分系统模块划分 1.二叉树是一种动态树表。 2.开辟一个空间建立一个节点,逐个加入,逐个建立。 3.利用查找函数,对数进行插入删除。 4.利用书中所学知识进行各种遍历,包括将所有方法归并在一起,还要建立查看 界面一边有系统的视觉效果。 1.61.6 主要功能模块设计主要功能模块设计 程序主要设计了几个功能:首先是创建二叉排序树,完成后出现任务菜单,菜 单中设计了八个模块:树状输出二叉树,前序遍历二叉树,中序遍历二叉树,后序 遍历二叉树,输出叶子结点,输出叶子结点个数,输出二叉树的深度,退出。 长春建筑学院数据结构课程设计(论文) - 3 - 第 2 章 系统总体设计 2.1 基本理论 (1)建立二叉树的操作就是用递归算法以先序遍历的次序从根结点开始建立一 棵二叉树。 (2)利用栈的非递归算法对二叉树进行遍历,从二叉树的根结点开始,自顶向 下,同层自左往右访问树中的每个结点,此时,保存结点的顺序和访问的顺序刚好 一致。 (3)用递归算法求出左右子树的深度。 需求分析 : (1)输入二叉树的特殊先序序列,建立二叉树。 (2)实现二叉树的层次遍历和中序遍历。 (3)求二叉树的深度。 (4)将二叉树中所有结点的左右子树相互交换。 (5)求二叉树中叶子结点的数目。 2.2 概要设计 creatbintree( if(i=) t=null; else t=(bintree)malloc(sizeof(bintnode); /生成根结点 id(!=t) exit(0); t-data=ch; createbintree(t-lchild); /构造左子树 createbintree(t-rchild); /构造右子树 return; 3.2 二叉树的层次遍历和中序遍历 中序遍历模块(以中序为例来说明) 遍历(traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做 一次访问。访问结点所做的操作依赖于具体的应用问题。二叉树共有三个部分组成, 即根结点,根结点的左子树,根结点的右子树。限定以从左至右方式共有三种遍历方 式,即前序遍历,中序遍历,后序遍历。中序遍历的原则:若被遍历的二叉树为非空, 则依次执行如下操作: 长春建筑学院数据结构课程设计(论文) - 5 - #include / malloc()等 #include / 标准输入输出头文件,包括 eof(=z 或 f6),null 等 #include / atoi(),exit() #include / 数学函数头文件,包括 floor(),ceil(),abs()等 #define clearbitree destroybitree / 清空二叉树和销毁二叉树的操作一样 typedef struct bitnode int data; / 结点的值 bitnode *lchild,*rchild; / 左右孩子指针 bitnode,*bitree; int nil=0; / 设整型以 0 为空 void visit(int e) printf(“%d “,e); / 以整型格式输出 void initbitree(bitree void createbitree(bitree scanf(“%d“, / 输入结点的值 if(number=nil) / 结点的值为空 t=null; else / 结点的值不为空 t=(bitree)malloc(sizeof(bitnode);/ 生成根结点 if(!t) exit(overflow); t-data=number; / 将值赋给 t 所指结点 createbitree(t-lchild); / 递归构造左子树 长春建筑学院数据结构课程设计(论文) - 6 - createbitree(t-rchild); / 递归构造右子树 void destroybitree(bitree / 递归销毁左子树,如无左子树,则不执行 任何操作 destroybitree(t-rchild); / 递归销毁右子树,如无右子树,则不执 行任何操作 free(t); / 释放根结点 t=null; / 空指针赋 0 void preordertraverse(bitree t,void(*visit)(int) / 初始条件:二叉树 t 存在,visit 是对结点操作的应用函数。修改算 法 6.1 / 操作结果:先序递归遍历 t,对每个结点调用函数 visit 一次且仅一次 if(t) / t 不空 visit(t-data); / 先访问根结点 preordertraverse(t-lchild,visit); / 再先序遍历左子树 preordertraverse(t-rchild,visit); / 最后先序遍历右子树 void inordertraverse(bitree t,void(*visit)(int) / 初始条件:二叉树 t 存在,visit 是对结点操作的应用函数 / 操作结果:中序递归遍历 t,对每个结点调用函数 visit 一次且仅一次 if(t) inordertraverse(t-lchild,visit); / 先中序遍历左子树 visit(t-data); / 再访问根结点 inordertraverse(t-rchild,visit); / 最后中序遍历右子树 长春建筑学院数据结构课程设计(论文) - 7 - void postordertraverse(bitree t,void(*visit)(int) / 初始条件:二叉树 t 存在,visit 是对结点操作的应用函数 / 操作结果:后序递归遍历 t,对每个结点调用函数 visit 一次且仅一次 if(t) / t 不空 postordertraverse(t-lchild,visit); / 先后序遍历左子树 postordertraverse(t-rchild,visit); / 再后序遍历右子树 visit(t-data); / 最后访问根结点 void main() bitree t; initbitree(t); / 初始化二叉树 t printf(“按先序次序输入二叉树中结点的值,输入 0 表示节点为空, 输入范例:1 2 0 0 3 0 0n“); createbitree(t); / 建立二叉树 t printf(“先序递归遍历二叉树:n“); preordertraverse(t,visit); /先序递归遍历二叉树 t printf(“n 中序递归遍历二叉树:n“); inordertraverse(t,visit); /中序递归遍历二叉树 t printf(“n 后序递归遍历二叉树:n“); postordertraverse(t,visit); /后序递归遍历二叉树 t 3.3 求二叉树的深度 树的深度组成该树各结点的最大层次 int bintreedepth(bintree t) /初始条件:二叉树存在 /操作结果:返回 t 的深度 int i,j; if (!t) return 0; /i 为左子树的深度 i=bintreedepth(bintree t-lchild); /j 为右子树的深度 长春建筑学院数据结构课程设计(论文) - 8 - j= bintreedepth(bintree t-rchild); return (ij)?(i+1):(j+1) 3.4 将二叉树中所有结点的左右子树相互交换 #include #include typedef struct binode int data; struct binode *lchild,*rchild; binode,*bitree; typedef struct bitree elem100; int top; stack; bitree creat_bt()/按扩展前序建二叉树 bitree t;int x; scanf(“%d“, if (x=0) t=null; else t=(bitree)malloc(sizeof(binode); t-data=x; t-lchild=creat_bt(); t-rchild=creat_bt(); return t; void exchange(bitree t) /左、右子树交换 bitree p; if(t!=null) p=t-lchild;t-lchild=t-rchild; t-rchild=p; exchange(t-lchild); exchange(t-rchild); void inorder(bitree bt) /递归的中序遍历 if (bt) inorder(bt-lchild); printf(“% d“,bt-data); inorder(bt-rchild); 长春建筑学院数据结构课程设计(论文) - 9 - main() bitree root; printf(“n“); printf(“建二叉树,输入元素:“); root=creat_bt(); /*create tree of useing preorder*/ printf(“交换前的中序序列是:“); inorder(root); exchange(root); printf(“n 交换后的中序序列是:“); inorder(root); printf(“n“); return; 3.5 求二叉树中叶子结点的数目 #include using namespace std; typedef struct tnode/二叉树结构 char nodevalue;/结点的值 tnode* left;/左子树 tnode* right;/右子树 *bitree; void createbitree(bitree cin nodevalue; if(nodevalue!=#)/结点非空 t=new tnode; t-nodevalue=nodevalue; createbitree(t-left); createbitree(t-right); else t=null; int countleaf(bitree t) static int leafnum=0;/叶子初始数目为 0,使用静态变量 if(t)/树非空 长春建筑学院数据结构课程设计(论文) - 10 - if(t-left=null/叶子数目加 1 else/不为叶子结点 countleaf(t-left);/递归统计左子树叶子数目 countleaf(t-right);/递归统计右子树叶子数目 return leafnum; 该模块功能主要是给用户提供清晰的可操作界面,易于人机操作,并能很好的 调用其他各模块,使程序更加优化,丝路更加清晰,结构更加明了,提高了程序的 实用性。其算法如下: /用来测试的 main 函数, int main() bitree t; int leafnum; cout“请输入中序遍历的二叉树序列(#号代表该结点为空):如 (abc#de#g#f#)“endl; createbitree(t); leafnum=countleaf(t); cout“该二叉树中叶子结点数为:“leafnumendl; return 0; 长春建筑学院数据结构课程设计(论文) - 11 - 第四章 流程分析图 4.1 二叉树的生成过程 二叉树的生成,采用逐个建立的方式。如图所示: 图图 4-14-1 二叉树建立二叉树建立 4.2 主要功能模块设计 程序主要设计了几个功能:首先是创建二叉排序树,完成后出现任务菜单,菜 单中设计了八个模块:树状输出二叉树,前序遍历二叉树,中序遍历二叉树,后序 遍历二叉树,输出叶子结点,输出叶子结点个数,输出二叉树的深度,退出。 主函数流程如下: 初始化数组 插入头结点点 空树 添加左子输 添加右孩数 插入 插入 插入 是 是 否 否 长春建筑学院数据结构课程设计(论文) - 12 - 是 是 是 是 图图 4-24-2 主函数流程图主函数流程图 4.3模块设计模块设计 本程序包含三个模块:主程序模块、建立二叉树模块和工作区模块。其调用关 系如图 4-3 所示。 主程序模块建立二叉树模块 工作区选择模块 4-34-3 模块调用示意图模块调用示意图 否 否 否 否 否 是 创建二叉排序树 switch()递归遍历 switch(0)exit(0)退出 switch()删除结点 switch() default提示出错 非递归遍历 是 是 是 是 长春建筑学院数据结构课程设计(论文) - 13 - 4.44.4 函数主要调用关系图函数主要调用关系图 本系统 11 个子程序之间的主要调用关系如图 4-4 所示。图中数字是各函数的编 号。 10 mainwork() 9876542 3 1 11 main() 4-44-4 系统函数调用关系图系统函数调用关系图 长春建筑学院数据结构课程设计(论文) - 14 - 第第 5 章章 系统测试系统测试 5.1 调试分析 1在调试过程中出现了很多次的程序错误,警告和不能运行。在很多次的 调试和重新改写之后,才可以用。 2visual c+确实是一门需要极其细心和耐心的课程,尤其在程序设计的过 程中不可有一丝的马虎大意,否则将会花很大力气去改正。 3.调试过程中最常见的便是代码输入错误,如字母大小写、顺序颠倒、符号的 半/全角使用等一些问题,都是在调试过程中逐一改正的。 4.本程序是二叉树最基本的操作,没有深入。难免在执行程序时对输入的其他 指令发生错误。所以只要根据本程序的说明操作即可。 5.我想以后还可以给此程序添加其他一些功能,例如创建的二叉树是空树还是 满二叉树;对创建的二叉树
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年烟草四川公司招聘考试真题及答案
- 中级计量经济学知到智慧树答案
- 计算机三级(信息安全技术)考试题(含答案)
- 中外名建筑赏析知到智慧树答案
- 中西方文化比较知到智慧树答案
- 中西医结合基础思路研究与方法知到智慧树答案
- 中学生物实验教学知到智慧树答案
- 2025版水电安装工程合同履行与维护合同
- 2025年仓储配送一体化大数据分析服务合同
- 2025版土地储备项目合作开发中介服务合同
- 勉县一中小升初数学试卷
- 2025一建《建设工程经济》计算、时间、数字考点笔记
- 校园基孔肯雅热防控措施课件
- 第1课 中国古代政治制度的形成与发展 课件 统编版高中历史选择性必修1
- 药师考试历年真题综合测试试卷(含答案)
- 2025年村级防疫员考试模拟试题及答案
- 快餐公司门店设备夜间关闭管理制度
- 以童心为笔:基于儿童心理发展需求的小学校园公共活动空间设计
- 生猪屠宰兽医卫生检验人员理论考试题库及答案
- 《护理伦理学》教学大纲(本科)
- 板带轧机刚度对热轧板形的影响
评论
0/150
提交评论