树与二叉树的转换及二叉树的遍历_设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、设计目的
二、问题描述
三、需求分析
四、概要设计
五、详细设计
六、调试分析
七、用户使用说明
八、测试结果
九、总结及分析
十、参考文献
1.设计目的
通过课程设计,巩固所学的理论知识,培养综合运用所学知识解决实际问题的能力。根
据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻
辑结构,合理地选择相映的存储结构,并能设计出解决问题的有效算法。
2.问题描述
要求:91)设计单向链表,实现二叉树的生成。
(2)实现对二叉树的遍历查询;
(3)实现对二叉树叶节点的增加;
3.需求分析
本程序的功能是对任意二叉树进行递归前序遍历和后序遍历,用栈实现非递归的前序、
和后序遍历,还有对树的层序遍历以及树与二叉树的转换。
本程序要求用户以字符输入,若要实现终端结点,最后以回车键建入数据。
本程序的结果将依次打印出递归前序遍历和后序遍历,用栈实现非递归的前序和中序遍
历和后序遍历,和线索化层序遍历,输入树及树传换成二叉树。
4.概要设计
4.1.二叉树创建
用链表实现创建一个树结点的结构体,从键盘输入数据,存入数组。把下标为2*i+1 的值存入左孩子,为2*i+2的存入右孩子。 BiNode creat(),BiNode stree_creat(char *a,int k)。
开始
Y
参数数组是否空或
N
把数组的值赋给结点的数
返回空指针
递归的给左子树赋值参数变为a[2i+1]
递归的给右子树赋值参数变为a[2i+2]
返回根指针
结束
图 1、二叉树的创建
4.2先序遍历二叉树的递归算法
若二叉树为空,则空操作;否则(1)访问根结点;(2)先序遍历左子树;(3)先序遍历右子树。void PreOrder(BiNode root)。
开始
Y
判断结点是否
N
访问根结点
按前根遍历方式
遍历左子树
按前根遍历方式遍
历左子树
结束
图2、前序递归遍历
4.3.中序遍历二叉树的递归算法
若二叉树为空,则空操作;否则(1)中序遍历左子树;(2)访问根结点;(3)中序遍历右子树。void InOrder(BiNode root)。
开始
Y
判断结点是否空
N
按中根遍历方式遍
历左子树
访问根结点
按中根遍历方式遍
历右子树
结束
图3、中序递归遍历
4.4.后序遍历二叉树的递归算法
若二叉树为空,则空操作;否则(1)后序遍历左子树;(2)后序遍历右子树。(3)访问根结点;void PostOrder(BiNode root)。
开始
Y
判断结点是否
N
按后根遍历方式遍
历左子树
按后根遍历方式遍
历右子树
访问根结点
结束
图4、后序递归遍历
5.详细设计
源程序:
6.调试分析
二叉树遍历中用到的最重要的一个思想就是递归调用,这次作业使我们对递归有了深入的理解,尤其是对退回上一层后应执行的语句和结点位置的丝路更加清晰。程序调试比较顺利。
用栈同样可以实现二叉树的遍历,这是我们认识到解决一额问题可以由多种不同的途径,应随时将以前学过的只是灵活应用起来,解决新问题。在使用栈结构时,为了方便,我才用了二叉树结构,将其与链式栈结合起来。
因为遍历二叉树的基本操作是访问结点,所以无论哪一种遍历方式,对含有n个结点的二叉树,其时间复杂度为O(n),所需辅助空间最大容量为树的深度,最坏为n,所以空间
复杂度为O(n)。
因该程序对应不同的遍历定义了不同的结构,使每种结构的通用性降低,可以往在递归和非递归中使用同一种结构这一方面做进一步的思考。
6.1 测试目的
测试该程序是否完成所有功能,以及程序存在的不足。
6.2.运行程序出现以下界面
7.总结及分析
以前用C编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭意识和简单的语句来堆砌出一段段程序。现在变成感觉完全不同了。在编写一个程序之前,自己能够综合考虑各种因素,首先选取自己需要的数据结构,是树还是图或是别的什么。然后再选定一种或几种存储结构来具体的决定后面的函数的主要风格。最后在编写每一个函数之前,可以自习斟酌出对挑选出最合适当前状况的算法。这样,即使在完整的程序还没有写出来之前,自己心中已经有了明确的原图了。这样无形中就提高了自己编写程序的质量。
另外,我还体会到深刻理解数据结构的重要性。只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。
这次试验也让我看到了自己的不足,还是不太用模版类。还有许多关于C++的一些比较具体的东西还不太懂,比方说指针。这次实验还让我意识到只有不管在机子上调试程序,自己的水平才能得到提高。
我会继续我的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步和提高。
10.参考文献
# include
# include
struct BTNode
{
int data;
struct BTNode * pLchild;//p是指针,L是左,child是孩子
struct BTNode * pRchild;
};
//函数声明
struct BTNode * CreateBTree(void);//创建树
void PreTraverseBTree(struct BTNode * pT);//先序遍历
void InTraverseBTree(struct BTNode * pT);//中序遍历
void PostTraverseBTree(struct BTNode * pT);//后续遍历
BTNode CreatBTNode(int data,BTNode root);//插叶子***********************