基于二叉树遍历系统设计与实现课程设计学位论文.docx
- 文档编号:12852040
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:23
- 大小:203.68KB
基于二叉树遍历系统设计与实现课程设计学位论文.docx
《基于二叉树遍历系统设计与实现课程设计学位论文.docx》由会员分享,可在线阅读,更多相关《基于二叉树遍历系统设计与实现课程设计学位论文.docx(23页珍藏版)》请在冰点文库上搜索。
基于二叉树遍历系统设计与实现课程设计学位论文
长春建筑学院《数据结构》课程设计(论文)
基于二叉树遍历系统设计与实现
BinarytreetraversalSystemDesignandImplementation
年级:
学号:
姓名:
专业:
指导老师:
二零一三年十二月
摘要
针对现实世界中许多关系复杂的数据,如人类社会的家谱,各种社会组织机构,博弈交通等复杂事物或过程以及客观世界中广泛存在的具有分支关系或层次特性的对象.如操作系统的文件构成、人工智能和算法分析的模型表示以及数据库系统的信息组织形式等,用线性结构难以把其中的逻辑关系表达出来,必须借助于数和图这样的非线性结构,因此在以模拟客观世界问题,解决客观世界问题为主要任务的计算机领域中树型结构是信息的一种重要组织形式,树有着广泛应用。
在树型结构的应用中又以二叉树最为常用。
二叉树是一种非常重要的非线性结构,所描述的数据有明显的层次关系,其中的每个元素只有一个前驱,二叉树是最为常用的数据结构,它的实际应用非常广泛,二叉树的遍历方式有三种,前序遍历,中序遍历,后序遍历,先序遍历的顺序为:
NLR先根结点,然后左子树,右子树;中序遍历顺序为;LNR先左子树,然后根结点,右子树;后序遍历顺序为:
LRN先左子树,然后右子树,根结点。
由前序和中序遍历,有中序和后序遍历序列可以唯一确定一棵二叉树。
对于给几个数据的排序或在已知的几个数据中进行查找,二叉树均能提供一种十分有效的方法,比如在查找问题上,任何借助于比较法查找长度为Ⅳ的一个序表的算法,都可以表示成一株二叉树。
反之,任何二叉树都对应一个查找有序表的有效方法根据树的数学理论,对于算法分析的某些最有启发性的应用,是与给出用于计算各种类型中不同树的数目的公式有关的。
本文对二叉树以及二叉树的各种功能做介绍以及写出一些基本的程序,让读者对二叉树的理解有更好的效果。
关键词:
二叉树;左子树;右子树
Abstract
Inmanyrealworldofcomplexdata,suchasthehumansocietyfamily,socialorganization,widespreadgametrafficcomplexthingorprocessandtheobjectiveworldwithabranchorlevelcharacteristicsoftheobject.Iftheoperatingsystemfileanalysis,artificialintelligenceandalgorithmmodelrepresentationanddatabaseinformationsystemtheformoforganization,withalinearstructuretoexpressthelogicrelationshipamongthem,mustdependonthenumberandthediagramofsuchnonlinearstructure,soinordertosimulatetheobjectiveworld,solveproblemsasthemaintaskofthecomputerfieldinthetreestructureisanimportantorganizationformofinformation,thetreehasabroadapplication.Intheapplicationoftreestructureinwhichthetwoforktreeisthemostcommonlyused.
Twobinarytreeisakindofveryimportantnonlinearstructure,hiberarchydescriptionofthedata,whereeachelementisonlyaprecursor,twoforktreeisthemostcommonlyuseddatastructure,itsapplicationisveryextensive,therearethreekindsoftwobinarytreetraversal,preordertraversal,inthetraversal,postordertraversal,preordertraversalsequence:
NLRtotherootnode,andthentheleftsubtree,rightsubtree;inordertraversalsequence;LNRbeforetheleftsubtree,thentherootnode,therightsubtree;afterthetraversalorder:
LRNfirstandthentheleftsubtree,rightsubtree,rootnode.Bypreordertraversalandtraversal,withtheorderandpostordertraversalsequencecanbeuniquelyidentifiedatwobinarytree.
Forseveraldatasortingorsearchinginseveraldataknown,twoforktreecanprovideaveryeffectivemethod,suchassearchproblems,anybythecomparisonmethodtofindthelengthofasequentialalgorithmofTableIV,canbeexpressedasatwoforktree.Conversely,anytwoforktreecorrespondstoaneffectivemethodtofindtheorderedlistaccordingtothemathematicaltheoryoftree,forsomealgorithmanalysisoftheapplicationofheuristic,isgivenforthenumberanddifferenttypesoftreecalculationformula.
Variousfunctionsoftwobinarytreeandbinarytreeinthispapertwointroducesandwritesomeofthebasicprocedures,toallowreaderstounderstandthetwoforktreehasabettereffect.
Keywords:
Twotree;theleftsubtree;rightsubtree
目录
摘要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.掌握二叉树结点结构的建立。
2.掌握先序、中序和后序遍历的基本操作。
1.2设计内容
利用二叉树特点和功能实现先序、中序和后序遍历系统的实现,具体功能:
输入、输出遍历结果、先序遍历、中序遍历和后序遍历,并能在屏幕上输出操作前后的结果。
1.3设计要求
1.写出系统需求分析,并建模。
2.编程实现,界面友好。
3.输出操作前后的结果。
4.提供测试报告。
1.4设计思想
1.建立二叉树采用一个一个输入的方式。
2.对二叉树进中序遍历采用递归函数和非递归函数分别实现多种遍历的方式。
另外还有层次遍历,来充分实现本书对树的遍历。
3.删除结点函数,采用边查找边删除的方式。
如果没有查找到,则不对树做任何的修改;如果查找到结点则删除。
1.5系统模块划分
1.二叉树是一种动态树表。
2.开辟一个空间建立一个节点,逐个加入,逐个建立。
3.利用查找函数,对数进行插入删除。
4.利用书中所学知识进行各种遍历,包括将所有方法归并在一起,还要建立查看界面一边有系统的视觉效果。
1.6主要功能模块设计
程序主要设计了几个功能:
首先是创建二叉排序树,完成后出现任务菜单,菜单中设计了八个模块:
树状输出二叉树,前序遍历二叉树,中序遍历二叉树,后序遍历二叉树,输出叶子结点,输出叶子结点个数,输出二叉树的深度,退出。
第2章系统总体设计
2.1基本理论
(1)建立二叉树的操作就是用递归算法以先序遍历的次序从根结点开始建立一棵二叉树。
(2)利用栈的非递归算法对二叉树进行遍历,从二叉树的根结点开始,自顶向下,同层自左往右访问树中的每个结点,此时,保存结点的顺序和访问的顺序刚好一致。
(3)用递归算法求出左右子树的深度。
需求分析 :
(1)输入二叉树的特殊先序序列,建立二叉树。
(2)实现二叉树的层次遍历和中序遍历。
(3)求二叉树的深度。
(4)将二叉树中所有结点的左右子树相互交换。
(5)求二叉树中叶子结点的数目。
2.2概要设计
CreatBinTree(&T):
建立一棵二叉树,
Value(T,e):
查找值为e的二叉树结点,并返回该结点的地址。
BinTreeDepth(T):
返回二叉树的深度,
Parent(T,e):
查找二叉树T中的值为e的结点的双亲,若没有根结点,则操作失败。
PreOrderTraverse(T):
先序遍历二叉树,并输出结点序列。
InorderTraverse(T):
中序遍历二叉树,并输出结点序列。
PostOrderTraverse(T):
后序遍历二叉树,并输出结点序列。
LevelOrderTraverse(T):
层次遍历二叉树,并输出结点序列。
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
第3章详细设计
3.1建立二叉树
Void CreateBinTree(BinTree&T)
{//按先序次序输入二叉树中结点的值
//构造二叉链表表示的二叉树T
TelemType ch;
Scanf(“%c”,&ch);
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)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。
访问结点所做的操作依赖于具体的应用问题。
二叉树共有三个部分组成,即根结点,根结点的左子树,根结点的右子树。
限定以从左至右方式共有三种遍历方式,即前序遍历,中序遍历,后序遍历。
中序遍历的原则:
若被遍历的二叉树为非空,则依次执行如下操作:
#include
#include
#include
#include
#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 &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(BiTNode));// 生成根结点
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); // 递归销毁右子树,如无右子树,则不执
行任何操作
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); // 最后中序遍历右子树
}
}
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 0\n");
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为右子树的深度
J= BinTreeDepth(BinTree T->rchild);
Return (i>j)?
(i+1):
(j+1)}
3.4将二叉树中所有结点的左右子树相互交换
#include
#include
typedef struct binode{
int data;
struct binode *lchild,*rchild;
}binode,*bitree;
typedef struct{
bitree elem[100];
int top;
}stack;
bitree 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(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);
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=nodeValue;
CreateBiTree(T->left);
CreateBiTree(T->right); }
else T=NULL;
}
int CountLeaf(BiTree T)
{
static int LeafNum=0;//叶子初始数目为0,使用静态变量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 二叉 遍历 系统 设计 实现 课程设计 学位 论文