二叉树的遍历算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉树的前序、后序的递归、非递归遍历算法
学生姓名:贺天立指导老师:湛新霞
摘要本课程设计主要解决树的前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现。在课程设计中,系统开发平台为Windows 2000,程序设计设计语言采用Visual C++,程序运行平台为Windows 98/2000/XP。用除递归算法前序,后续,中序遍历树外还通过非递归的算法遍历树。程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在商业中解决实际问题。
关键词程序设计;C++;树的遍历;非递归遍历
1 引言
本课程设计主要解决树的前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现。
1.1课程设计的任务
构造一棵树并输入数据,编写三个函数,非别是树的前序递归遍历算法、树的后序递归遍历算法、树的非递归中序遍历算法(这里的非递归以中序为例)。在主程序中调用这三个函数进行树的遍历,观察用不同的遍历方法输出的数据的顺序和验证递归与非递归输出的数据是否一样。
1.2课程设计的性质
由要求分析知,本设计主要要求解决树的前序、后序的递归、非递归遍历算法,层次序的非递归遍历算法的实现。所以设计一个良好的前序、后序的递归、非递归遍历算法非常重要。
1.3课程设计的目的
在程序设计中,可以用两种方法解决问题:一是传统的结构化程序设计方法,
二是更先进的面向对象程序设计方法[1]。
利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用C语言进行程序设计。巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。
树的遍历分为前序、中序和后序,可以用递归算法实现树的三种遍历。除了递归外还可以构造栈,利用出栈和入栈来实现树的前序遍历、中序遍历和后序遍历。
2需求分析
(1)根据给定二叉树的先序遍历结果,构造出该二叉树;
按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树。
(2)给出该二叉树的递归前序和后序遍历结果还有非递归中序遍历结果。
二叉树非递归遍历是用显示栈来存储二叉树的结点指针。前序遍历时,按二叉树前序遍历的顺序访问结点并将结点的指针入栈,直到栈顶指针指向的结点的左指针域为空时取出栈顶指针并删除栈顶指针,访问刚取出的指针指向的结点的右指针指向的结点并将其指针入栈,如此反复执行且在有标志的情况下实现前序非递归算法。前序遍历二叉树的递归遍历为若二叉树为空,则算法结束,否则(1)访问根结点,(2)前序遍历左子树,(3)前序遍历右子树。后序遍历得递归为若二叉树非空,则依次执行如下操作:(1)遍历左子树;(2)遍历右子树;(3)访问根结点。
3 概要设计
3.1数据存储结构
二叉树的存储结构
typedef char DataType;
struct BitreeNode{
DataType data;
BitreeNode *lchild;
BitreeNode *rchild;
};
3.2基本操作
T=CreateBitree();
//创建树
Preorder(T) ;
//输出树的前序遍历
Postorder(T);
//输出树的后序遍历
Inorder2(T);
//输出树的非递归中序遍历
以下为流程图:
4 详细设计
4.1数据类型定义
二叉树的定义:
二叉树的存储结构
typedef char DataType;
struct BitreeNode{
DataType data;
//二叉树的数据
BitreeNode *lchild;
//指向左孩子的指针
BitreeNode *rchild;
//指向右孩子的指针
};
4.2系统主要子程序详细设计
主程序模块设计及用户工作区模块设计:void main()
{
struct BitreeNode *T=0;
// 定义T为指向BitreeNode类型的指针
T=CreateBitree();
// 用前序输入法创建二叉树
printf("\n前序遍历\n");
Preorder(T) ;
//用前序递归输入法输出二叉树
printf("\n后序遍历\n");
Postorder(T);
//用后序递归输入法输出二叉树
printf("\n中序遍历(非递归)\n");
Inorder2(T);
//用中序非递归输入法输出二叉树
cout<<"\n";
DeleteTree(T);
//释放二叉树
}
以下是各子函数的定义:
① 创建二叉树
//按先序次序输入二叉树
BitreeNode *CreateBitree()
{ char ch;
scanf("%c",&ch);
BitreeNode* T=NULL;
if(ch!='#')
{
T= (struct BitreeNode*)(malloc(sizeof(struct BitreeNode)));
T->data=ch;
T->lchild=CreateBitree();
T->rchild=CreateBitree();
}
return T;
}
②先序递归遍历二叉树:
void Preorder(struct BitreeNode *p) {
if (p!=NULL)
{
printf("%c",p->data);
Preorder( p->lchild );
Preorder(p->rchild );
}
}