数据结构课程设计说明书题目:二叉树的遍历学生姓名:学号:院(系):专业:指导教师:年月日目录1需求分析..............................................................12概要设计..............................................................12.1功能设计.........................................................12.2算法流程图.......................................................23详细设计..............................................................23.1创建二叉树.......................................................23.2二叉树的递归遍历算法.............................................33.3二叉树的层次遍历算法.............................................33.4二叉树的非递归遍历算法...........................................34测试数据与分析........................................................35算法分析..............................................................96总结..................................................................9参考文献............................................................10附录...................................................................11数据结构课程设计11需求分析数据结构是信息类专业最重要的专业基础课程,掌握好数据结构的知识将直接关系到后续专业课程的学习。数据结构研究四个方面的问题:(1)数据的逻辑结构,即数据之间的逻辑关系;(2)数据的物理结构,即数据在计算机内的存储方式;(3)对数据的加工,即基于某种存储方式的操作算法;(4)算法的分析;即评价算法的优劣。本实验是用链式存储结构来存储二叉树并进行一系列的算法,且结点内容的数据类型为字符型。根据题目知,程序主要是根据给定二叉树的先序遍历结果,构造出二叉树并输出按中,后序遍历的结果,以及求二叉树的叶子个数等。其中二叉树的结点用字符表示。(1)创建二叉树:按先序次序输入,构造二叉链表表示的二叉树。(2)设计算法:先序遍历,中序遍历,后序遍历。(3)编写程序:设计main()函数调用以上步骤实现相关功能。本程序用MicrosoftVisualStudio2008编写,可以实现各种二叉树的遍历。包括先序遍历、中序遍历、后序遍历的递归算法,先序遍历、中序遍历、后序遍历的非递归算法以及能查找任一结点在某种遍历序列中的前驱和后继。2概要设计2.1功能设计(1)typedefstructBTNode—定义二叉树定义一个用链式存储结构存储的二叉树,其中包括左孩子和右孩子以及数据元素的内容。和单链表类似,一个二叉链表由头指针唯一确定,若二叉树为空,则头指针指向空。并且结点内容的数据类型为字符型。(2)CreateBiTree(BiTree&T)—构建二叉树此函数的功能是构建二叉树。从键盘上按先序次序输入字符构造二叉链表表示的二叉树T,其中用星号表示空树。(3)NRPreOrder(BiTreebt)—先序遍历(非递归)此函数的功能是用非递归的方法实现二叉树的先序遍历算法。调用此函数可以获得二叉树的非递归的先序遍历的结果。(4)NRInOrder(BiTreebt)—中序遍历(非递归)此函数的功能是用非递归的方法实现二叉树的中序遍历算法。调用此函数可以获得二叉树的非递归的中序遍历的结果。(5)NRPostOrder(BiTreebt)—后序遍历(非递归)此函数的功能是用非递归的方法实现二叉树的后序遍历算法。调用此函数可以获得二叉树的非递归的后序遍历的结果。其中bt是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。需要判断根结点的左右子树是否均遍历过。可采用标记法,结点入栈时,配一个标志tag一同入栈1:遍历左子树的现场保护,2:遍历右子树前的现场保护。首先将bt和tag(为1)入栈,遍历左子树;返回后,修改栈顶tag为2,遍历右子树;最后访问根结点。(6)PreOrderTraverse(BiTreeT)—先序遍历(递归)数据结构课程设计2函数功能是用递归的方法对二叉树进行先序遍历,调用此函数可以获得二叉树的递归的先序遍历的结果。(7)InOrderTraverse(BiTreeT)—中序遍历(递归)函数功能是用递归的方法对二叉树进行中序遍历,调用此函数可以获得二叉树的递归的中序遍历的结果。(8)PostOrderTraverse(BiTreeT)—后序遍历(递归)函数功能是用递归的方法对二叉树进行后序遍历,调用此函数可以获得二叉树的递归的后序遍历的结果。(9)main()主函数用while()与switch(select)语句对二叉树的操作的算法进行了设计。可以实现以上函数的功能,并能退出程序。2.2算法流程图算法流程图如图1所示。图2-1算法流程图3详细设计3.1创建二叉树(1)定义二叉树结点值的类型为字符型。(2)结点个数不超过10个。(3)按先序次序输入,构造二叉链表表示的二叉树T,空格表示空树。数据结构课程设计33.2二叉树的递归遍历算法DLR(1)访问根结点。(2)先序遍历根结点的左子数。(3)先序遍历根结点的右子数。LDR(1)先序遍历根结点的左子数。(2)访问根结点。(3)先序遍历根结点的右子数。LRD(1)先序遍历根结点的左子数。(2)先序遍历根结点的右子数。(3)访问根结点。3.3二叉树的层次遍历算法(1)访问该元素所指结点。(2)若该元素所指结点的左右孩子结点非空,则该元素所指结点的左孩子指针和右孩子指针顺序入队。3.4二叉树的非递归遍历算法(1)非递归的先序遍历算法a.访问结点的数据域。b.指针指向p的左孩子结点。c.从栈中弹出栈顶元素。d.指针指向p的右孩子结点。(2)非递归的中序遍历算法a.指针指向p的左孩子结点。b.从栈中弹出栈顶元素。c.访问结点的数据域。d.指针指向p的右孩子结点。(3)非递归的后序遍历算法bt是要遍历树的根指针,后序遍历要求在遍历完左右子树后,再访问根。需要判断根结点的左右子树是否均遍历过。可采用标记法,结点入栈时,配一个标志tag一同入栈(1:遍历左子树前的现场保护。2:遍历右子树前的现场保护)。首先将bt和tag(为1)入栈,遍历左子树;返回后,修改栈顶tag为2,遍历右子树;最后访问根结点。4测试数据与分析(1)运行程序,进入开始界面数据结构课程设计4图4-1开始运行(2)选择1,创建二叉树图4-2创建二叉树(3)选择2,显示递归-中序遍历二叉树数据结构课程设计5图4-3递归-中序遍历二叉树(4)选择3,递归-前序遍历二叉树图4-4递归-前序遍历二叉树(5)选择4,递归-后序遍历二叉树数据结构课程设计6图4-5递归-后序遍历二叉树(6)选择5,非递归-后序遍历二叉树图4-6非递归-后序遍历二叉树(7)选择6,层次遍历二叉树数据结构课程设计7图4-7层次遍历二叉树(8)选择7,计算二叉树的高度图4-8二叉树的高度(9)选择8,计算二叉树的结点的个数数据结构课程设计8图4-9二叉树的结点的个数(10)选择9,计算二叉树的叶子结点个数图4-10二叉树的叶子结点个数(11)选择10,交换二叉树的所有子树数据结构课程设计9图4-11交换二叉树的所有子树(12)选择0,则退出系统5算法分析本程序按递归遍历所耗费的时间复杂度为O(n),其所耗费的空间复杂度也为O(n)。6总结这次课程设计,虽然看起来很简单,但是真的做起来的时候就发现了困难重重,让我深刻的体会到了要用C语言做一个二叉树的遍历,里面需要的很多知识还是我们没有接触过的,所以我们需要不断的实践,不断的学习,不断的发现问题去思考问题。通过此这次课程设计,我掌握了二叉树的存储实现,掌握了二叉树的遍历思想,掌握了二叉树的常见算法的程序实现。二叉树的高度(深度)为二叉树中结点层次的最大值,也可视为其左右字数高度的最大值加一。遍历二叉树的问题可以分解成两步,第一步是求出某种遍历次序下第一个被访问的结点,然后连续求出刚访问结点的后继结点,直至所有的结点均被访问。10参考文献[1]张铭.数据结构与算法.北京:高等教育出版社,2008.[2]耿国华编.数据结构——用C语言描述[M].北京:高等教育出版社,2011.6[3]谭浩强著.C++面向对象设计[M].北京:清华大学出版社,2004.6[4]谭浩强著.C++程序设计[M].北京:清华大学出版社,2004.611附录源程序代码#includestdio.h#includemalloc.h#defineMAXSIZE100typedefcharDataType;typedefstructBiTNode/*二叉链表存储结构*/{DataTypedata;structBiTNode*lchild,*rchild;}BiTree;typedefBiTree*ElemType;/*栈中数据元素类型,栈中保存结点指针*/typedefstruct{ElemTypedata[MAXSIZE];inttop;}SeqStack;/*栈的类型定义,顺序栈*/typedefstruct{ElemTypequeue[MAXSIZE];intfront,rear;}SP;SeqStack*initSeqStack()/*初始化栈*/{SeqStack*s;/*首先建立栈空间,然后初始化栈顶指针*/s=(SeqStack*)malloc(sizeof(SeqStack));s-top=-1;returns;}intpush(SeqStack*s,ElemTypex){if(s-top==MAXSIZE-1){/*栈满不能入栈*/printf(栈满);return0;}s-top++;s-data[s-top]=x;return1;}voidpop(SeqStack*s)/*出栈,假设栈不空*/{s-top--;}intempty(SeqStack*s){if(s-top==-1)return1;elsereturn0;}ElemTypetop(SeqStack*s)/*设栈不空*/{return(s-data[s-top]);}/*递归算法创建二叉链表*/BiTree*createBiTree()12{DataTypech;BiTree*T;ch=getchar();if(ch=='0')returnNULL;else{T=(BiTree*)malloc(sizeof(BiTree));T-data=ch;T-lchild=createBiTree();T-rchild=createBiTree();returnT;}}/*中序遍历二叉树的递归算法*/voidInOrder(BiTree*T){if(T){InOrder(T-lchild);printf(%c,T-data);InOrder(T-rchild);}}/*前序遍历二叉树的递归算法*/voidPreOrder(BiTree*T){if(T){printf(%c,T-data);PreOrder(T-l