基于二叉树遍历系统设计与实现课程设计论文_第1页
基于二叉树遍历系统设计与实现课程设计论文_第2页
基于二叉树遍历系统设计与实现课程设计论文_第3页
基于二叉树遍历系统设计与实现课程设计论文_第4页
基于二叉树遍历系统设计与实现课程设计论文_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、长春建筑学院?数据结构?课程设计论文基于二叉树遍历系统设计与实现基于二叉树遍历系统设计与实现Binary tree traversal System Design and Implementation年 级: 学 号: 姓 名: 专 业: 指导老师: 二零一三年十二月摘 要 针对现实世界中许多关系复杂的数据,如人类社会的家谱,各种社会组织机构,博弈交通等复杂事物或过程以及客观世界中广泛存在的具有分支关系或层次特性的对象如操作系统的文件构成、人工智能和算法分析的模型表示以及数据库系统的信息组织形式等,用线性结构难以把其中的逻辑关系表达出来,必须借助于数和图这样的非线性结构,因此在以模拟客观世界问

2、题,解决客观世界问题为主要任务的计算机领域中树型结构是信息的一种重要组织形式,树有着广泛应用。在树型结构的应用中又以二叉树最为常用。二叉树是一种非常重要的非线性结构,所描述的数据有明显的层次关系,其中的每个元素只有一个前驱,二叉树是最为常用的数据结构,它的实际应用非常广泛,二叉树的遍历方式有三种,前序遍历,中序遍历,后序遍历,先序遍历的顺序为:NLR 先根结点,然后左子树,右子树;中序遍历顺序为;LNR 先左子树,然后根结点,右子树;后序遍历顺序为:LRN 先左子树,然后右子树,根结点。由前序和中序遍历,有中序和后序遍历序列可以唯一确定一棵二叉树。对于给几个数据的排序或在的几个数据中进行查找,

3、二叉树均能提供一种十分有效的方法,比方在查找问题上,任何借助于比拟法查找长度为的一个序表的算法,都可以表示成一株二叉树。反之,任何二叉树都对应一个查找有序表的有效方法根据树的数学理论,对于算法分析的某些最有启发性的应用,是与给出用于计算各种类型中不同树的数目的公式有关的。本文对二叉树以及二叉树的各种功能做介绍以及写出一些根本的程序,让读者对二叉树的理解有更好的效果。关键词:二叉树; 左子树; 右子树AbstractIn many real world of complex data, such as the human society family, social organization,

4、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 str

5、ucture 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 t

6、ree 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

7、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 l

8、eft 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 o

9、r 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

10、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

11、 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目 录摘 要 .IABSTRACT. 第 1 章 绪 论.11.1 设计目的.11.2 设计内容.11.3 设计要求.11.4 设计思想.21.5 系统模块划分.21.6 主要功能模块设计.2第 2 章 系统总体设计.32.1 根本理论.32.2 概要设计.3第 3 章 详细设计.43.1 建立二叉树.43.

12、2 二叉树的层次遍历和中序遍历.43.3 求二叉树的深度.73.4 将二叉树中所有结点的左右子树相互交换.73.5 求二叉树中叶子结点的数目.9第 4 章 流程分析图.114.1 流程图.114.2 主要功能模块设计.114.3 模块设计.124.4 函数主要调用关系图.13第 5 章 系统测试.145.1 调试分析.145.2 实验结果.15结 论.17致 谢.18参考文献.18第 1 章 绪 论引言:引言: 树型结构是一类重要的非线性数据结构,其中一树和二叉树最重要。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构够可以用树来形象表示。树在计算机领域中也得到了广泛应用,如在编

13、译程序中,可以用树来表示源程序的语法结构。二叉树是一种非线性数据结构,对它进行操作时总需要对每个数据逐一进行操作,这样就存在一个操作顺序问题,由此提出了二叉树的遍历操作问题,所谓遍历二叉树就是按某种顺序访问二叉树中某个结点一次且仅一次的过程,这里的访问可以是输出.比拟.更新.查看元素内容等各种操作。1.1 设计目的1.掌握二叉树结点结构的建立。 2.掌握先序、中序和后序遍历的根本操作。1.2 设计内容 利用二叉树特点和功能实现先序、中序和后序遍历系统的实现,具体功能:输入、输出遍历结果、先序遍历、中序遍历和后序遍历,并能在屏幕上输出操作前后的结果。1.3 设计要求1.写出系统需求分析,并建模。

14、 2.编程实现,界面友好。 3.输出操作前后的结果。4.提供测试报告。1.41.4 设计思想设计思想1.建立二叉树采用一个一个输入的方式。 2.对二叉树进中序遍历采用递归函数和非递归函数分别实现多种遍历的方式。另外还有层次遍历,来充分实现本书对树的遍历。 3.删除结点函数,采用边查找边删除的方式。如果没有查找到,那么不对树做任何的修改;如果查找到结点那么删除。1.51.5 系统模块划分系统模块划分 1.二叉树是一种动态树表。 2.开辟一个空间建立一个节点,逐个参加,逐个建立。 3.利用查找函数,对数进行插入删除。 4.利用书中所学知识进行各种遍历,包括将所有方法归并在一起,还要建立查看界面一边

15、有系统的视觉效果。1.61.6 主要功能模块设计主要功能模块设计 程序主要设计了几个功能:首先是创立二叉排序树,完成后出现任务菜单,菜单中设计了八个模块:树状输出二叉树,前序遍历二叉树,中序遍历二叉树,后序遍历二叉树,输出叶子结点,输出叶子结点个数,输出二叉树的深度,退出。第 2 章 系统总体设计2.1 根本理论1建立二叉树的操作就是用递归算法以先序遍历的次序从根结点开始建立一棵二叉树。(2)利用栈的非递归算法对二叉树进行遍历,从二叉树的根结点开始,自顶向下,同层自左往右访问树中的每个结点,此时,保存结点的顺序和访问的顺序刚好一致。(3)用递归算法求出左右子树的深度。需求分析 :1输入二叉树的

16、特殊先序序列,建立二叉树。2实现二叉树的层次遍历和中序遍历。3求二叉树的深度。4将二叉树中所有结点的左右子树相互交换。5求二叉树中叶子结点的数目。2.2 概要设计CreatBinTree(&T):建立一棵二叉树,Value(T,e):查找值为 e 的二叉树结点,并返回该结点的地址。BinTreeDepth(T):返回二叉树的深度,Parent(T,e):查找二叉树 T 中的值为 e 的结点的双亲,假设没有根结点,那么操作失败。PreOrderTraverse(T):先序遍历二叉树,并输出结点序列。InorderTraverse(T):中序遍历二叉树,并输出结点序列。PostOrderT

17、raverse(T):后序遍历二叉树,并输出结点序列。 LevelOrderTraverse(T):层次遍历二叉树,并输出结点序列。说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。第 3 章 详细设计Void CreateBinTree(BinTree&T) /按先序次序输入二叉树中结点的值 /构造二叉链表表示的二叉树 T TelemType ch; Scanf(“%c,&ch); If(i=) T=Null; Else T=(BinTree)malloc(sizeof(BinTNode); /生成根结点 Id(!=T) Exit(0

18、); T-data=ch; CreateBinTree(T-lchild); /构造左子树 CreateBinTree(T-rchild); /构造右子树 Return; 3.2 二叉树的层次遍历和中序遍历中序遍历模块以中序为例来说明遍历Traversal是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。二叉树共有三个局部组成,即根结点,根结点的左子树,根结点的右子树。限定以从左至右方式共有三种遍历方式,即前序遍历,中序遍历,后序遍历。中序遍历的原那么:假设被遍历的二叉树为非空,那么依次执行如下操作:#include / malloc()等

19、#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) prin

20、tf(%d ,e); / 以整型格式输出 void InitBiTree(BiTree &T) / 操作结果:构造空二叉树 T T=NULL; void CreateBiTree(BiTree &T) / 算法 6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义), / 构造二叉链表表示的二叉树 T。变量 Nil 表示空(子)树。修改int number;scanf(%d,&number); / 输入结点的值 if(number=Nil) / 结点的值为空 T=NULL;else / 结点的值不为空 T=(BiTree)malloc(sizeof(B

21、iTNode);/ 生成根结点 if(!T) exit(OVERFLOW); T-data=number; / 将值赋给 T 所指结点 CreateBiTree(T-lchild); / 递归构造左子树 CreateBiTree(T-rchild); / 递归构造右子树 void DestroyBiTree(BiTree &T) / 初始条件:二叉树 T 存在。操作结果:销毁二叉树 T if(T) / 非空树 DestroyBiTree(T-lchild); / 递归销毁左子树,如无左子树,那么不执行任何操作 DestroyBiTree(T-rchild); / 递归销毁右子树,如无右

22、子树,那么不执行任何操作 free(T); / 释放根结点T=NULL; / 空指针赋 0 void PreOrderTraverse(BiTree T,void(*Visit)(int) / 初始条件:二叉树 T 存在,Visit 是对结点操作的应用函数。修改算 / 操作结果:先序递归遍历 T,对每个结点调用函数 Visit 一次且仅一次 if(T) / T 不空 Visit(T-data); / 先访问根结点 PreOrderTraverse(T-lchild,Visit); / 再先序遍历左子树 PreOrderTraverse(T-rchild,Visit); / 最后先序遍历右子树

23、void InOrderTraverse(BiTree T,void(*Visit)(int) / 初始条件:二叉树 T 存在,Visit 是对结点操作的应用函数 / 操作结果:中序递归遍历 T,对每个结点调用函数 Visit 一次且仅一次 if(T) InOrderTraverse(T-lchild,Visit); / 先中序遍历左子树Visit(T-data); / 再访问根结点 InOrderTraverse(T-rchild,Visit); / 最后中序遍历右子树 void PostOrderTraverse(BiTree T,void(*Visit)(int) / 初始条件:二叉树

24、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); Cre

25、ateBiTree(T); / 建立二叉树 T printf(先序递归遍历二叉树:n); PreOrderTraverse(T,visit); /先序递归遍历二叉树 T printf(n 中序递归遍历二叉树:n); InOrderTraverse(T,visit); /中序递归遍历二叉树 T printf(n 后序递归遍历二叉树:n); PostOrderTraverse(T,visit); /后序递归遍历二叉树 T 求二叉树的深度树的深度组成该树各结点的最大层次Int BinTreeDepth(BinTree T) /初始条件:二叉树存在 /操作结果:返回 T 的深度 Int i,j; if

26、 (!T) return 0; /i 为左子树的深度 i=BinTreeDepth(BinTree T-lchild); /j 为右子树的深度 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; bitr

27、ee creat_bt()/按扩展前序建二叉树 bitree t;int x; scanf(%d,&x); 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(

28、t-rchild); void inorder(bitree bt) /递归的中序遍历 if (bt) inorder(bt-lchild); printf(% d,bt-data);inorder(bt-rchild); main() bitree root; printf(n); printf(建二叉树,输入元素:); root=creat_bt(); /*create tree of useing preorder*/ printf(交换前的中序序列是:); inorder(root); exchange(root); printf(n 交换后的中序序列是:); inorder(root

29、); printf(n); return; 3.5 求二叉树中叶子结点的数目#include using namespace std; typedef struct TNode/二叉树结构 char nodeValue;/结点的值 TNode* left;/左子树 TNode* right;/右子树 *BiTree; void CreateBiTree(BiTree &T)/中序遍历方式创立二叉树 ,输入#代表该结点空 char nodeValue; cin nodeValue; if(nodeValue!=#)/结点非空 T=new TNode; T-nodeValue=nodeVa

30、lue; CreateBiTree(T-left); CreateBiTree(T-right); else T=NULL; int CountLeaf(BiTree T) static int LeafNum=0;/叶子初始数目为 0,使用静态变量 if(T)/树非空 if(T-left=NULL&T-right=NULL)/为叶子结点 LeafNum+;/叶子数目加 1 else/不为叶子结点 CountLeaf(T-left);/递归统计左子树叶子数目 CountLeaf(T-right);/递归统计右子树叶子数目 return LeafNum; 该模块功能主要是给用户提供清晰的

31、可操作界面,易于人机操作,并能很好的调用其他各模块,使程序更加优化,丝路更加清晰,结构更加明了,提高了程序的实用性。其算法如下: /用来测试的 main 函数,int main() BiTree T; int leafNum; cout请输入中序遍历的二叉树序列(#号代表该结点为空):如(ABC#DE#G#F#)endl; CreateBiTree(T); leafNum=CountLeaf(T); cout该二叉树中叶子结点数为:leafNumendl; return 0; 第四章 流程分析图4.1 二叉树的生成过程二叉树的生成,采用逐个建立的方式。如下图: 图图 4-14-1 二叉树建立二

32、叉树建立4.2 主要功能模块设计 程序主要设计了几个功能:首先是创立二叉排序树,完成后出现任务菜单,菜单中设计了八个模块:树状输出二叉树,前序遍历二叉树,中序遍历二叉树,后序遍历二叉树,输出叶子结点,输出叶子结点个数,输出二叉树的深度,退出。主函数流程如下:初始化数组插入头结点点空树添加左子输添加右孩数插入插入插入是是否否是是是是 图图 4-24-2 主函数流程图主函数流程图模块设计模块设计本程序包含三个模块:主程序模块、建立二叉树模块和工作区模块。其调用关系如图 4-3 所示。 主程序模块建立二叉树模块工作区选择模块4-34-3 模块调用示意图模块调用示意图否否否否否是创立二叉排序树Swit

33、ch()递归遍历Switch(0)Exit(0)退出Switch()删除结点Switch()default提示出错非递归遍历是是是是4.44.4 函数主要调用关系图函数主要调用关系图本系统 11 个子程序之间的主要调用关系如图 4-4 所示。图中数字是各函数的编号。10 mainwork()98765423111 main()4-44-4 系统函数调用关系图系统函数调用关系图第第 5 章章 系统测试系统测试5.1 调试分析 1在调试过程中出现了很屡次的程序错误,警告和不能运行。在很屡次的调试和重新改写之后,才可以用。 2Visual C+确实是一门需要极其细心和耐心的课程,尤其在程序设计的过程中不可有一丝的马虎大意,否那么将会花很大力气去改正。3.调试过程中最常见的

温馨提示

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

评论

0/150

提交评论