重庆交通大学数据结构课程设计树的遍历算法实验报告.docx
- 文档编号:22988837
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:12
- 大小:53.13KB
重庆交通大学数据结构课程设计树的遍历算法实验报告.docx
《重庆交通大学数据结构课程设计树的遍历算法实验报告.docx》由会员分享,可在线阅读,更多相关《重庆交通大学数据结构课程设计树的遍历算法实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
重庆交通大学数据结构课程设计树的遍历算法实验报告
重庆交通大学信息科学与工程学院
综合性设计性实验报告
班级:
物联网15xx班
姓名学号:
gllh
实验项目名称:
树的遍历算法
实验项目性质:
综合性
实验所属课程:
《算法与数据结构》
实验室(中心):
语音楼801信息实验室
指导教师:
xxx
实验完成时间:
2017年11月23日
一、问题描述
本实验要求对二叉树进行对每一个结点进行访问。
树的遍历是树的一种重要的运算。
所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次。
二叉树的3种最重要的遍历方式分别称为前序遍历、中序遍历和后序遍历。
以这3种方式遍历一棵树时,若按访问结点的先后次序将结点排列起来,就可分别得到树中所有结点的前序列表,中序列表和后序列表。
相应的结点次序分别称为结点的前序、中序和后序。
二、基本要求
建立一棵二叉树,编写程序,对二叉树进行前、中、后序和层次进行遍历,给出算法,并打印结果,本程序用VC6.0编写,实现建立一棵二叉树的功能输入二叉树数据
1.输入形式和输入值的范围:
输入数据格式不限,具体定义为char字符格式输入,并以嵌套表示法输入,以‘#’字符结尾。
2.输出的形式:
输出二叉树的前序、中序、后序以及层次遍历结果。
3.程序所能达到的功能:
a)输入二叉树的先序序列构造相应的二叉树;
b)前序递归遍历二叉树,输出得到的节点序列;
c)中序递归遍历二叉树,输出得到的节点序列;
d)后序递归遍历二叉树,输出得到的节点序列;
e)前序非递归遍历二叉树,输出得到的节点序列;
f)中序非递归遍历二叉树,输出得到的节点序列;
g)后序非递归遍历二叉树,输出得到的节点序列
h)层次遍历二叉树,输出得到的节点序列
三、测试数据
本实验采用本人学号631507030101进行数据测试
具体二叉树结构如下:
在建立时以createbtree(bt,"6(3(5(3(,0)),0(,0)),1(7(,1
(1)),0))#")方法建立。
四、算法思想
1)建立二叉树结构
建立二叉树时要明确建立的树的结构,本实验以嵌套表示法进行建树,二叉树用链表存储来实现,因此要先定义一个二叉树链表存储结构。
因此要先定义一个结构体。
此结构体的每个结点都是由数据域data、左指针域Lchild、右指针域Rchild两个指针域分别指向该结点的左、右孩子,若某结点没有左孩子或者右孩子时,对应的指域就为空。
最后,还需要一个链表的头指针指向根结点。
第一步的时候一定要先定义一个结束标志符号,例如空格键、#等。
当它遇到该标志时,就指向为空。
建立左右子树时,仍然是调用createbtree()函数,依此递归进行下去,直到遇到结束标志时停止操作。
2)输入二叉树元素
输入二叉树时,是按上面所确定的遍历规则输入的。
最后,用一个返回值来表示所需要的。
3)先序遍历二叉树
当二叉树为非空时,执行以下三个操作:
访问根结点、遍历左子树、遍历右子树。
4)中序遍历二叉树
当二叉树为非空时,程序执行以下三个操作:
遍历左子树、访问根结点、遍历右子树。
5)后序遍历二叉树
当二叉树为非空时,程序执行以下三个操作:
遍历左子树、遍历右子树、访问根结点。
6)层次遍历二叉树
当二叉树为非空时,程序执行以下三个操作:
从根结点依次从上至下从左至右进行遍历。
7)主程序
需列出各个函数,然后进行函数调用。
五、数据结构
本实验数据以本人学号(631507030101)以char形式进行存储。
六、源程序
#include
#definemaxsize100
typedefcharelemtype;
typedefstructbinode{//定义二叉树结点结构体,一装data域,两个指向左右孩子指针;
elemtypedata;
binode*lchild,*rchild;
}bitree;
voidcreatebtree(bitree*&bt,char*str){//建树函数,传递进入根节点指针和字符串;
bitree*stack[maxsize],*p;
bt=NULL;
inttop=-1,k,j=0;
charch;
ch=str[j];
while(ch!
='#'){//判断是否是结尾;
switch(ch){
case'(':
top++;
stack[top]=p;//建立一个堆栈存储数据;
k=1;
break;
case')':
top--;
break;
case',':
k=2;
break;
default:
p=newbinode;
p->data=ch;
p->lchild=p->rchild=NULL;//判断叶节点;
if(bt==NULL)
bt=p;
else
switch(k)
{case1:
stack[top]->lchild=p;break;
case2:
stack[top]->rchild=p;break;}
}
j++;
ch=str[j];}
}
voidprintree(bitree*boot){//打印二叉树函数,传入二叉树根节点指针;
bitree*b=boot;
if(b!
=NULL){
cout<
if((b->lchild!
=NULL)||(b->rchild!
=NULL)){//如果结点左右孩子非空;
cout<<"(";
printree(b->lchild);//指针指向左孩子;
if(b->rchild!
=NULL)cout<<",";
printree(b->rchild);//指针指向右孩子;
cout<<")";
}
}
}
voidPredigui(bitree*b)//递归前序遍历
{
if(b==NULL)
return;
cout<
Predigui(b->lchild);
Predigui(b->rchild);
}
voidMiddigui(bitree*b)//递归中序遍历
{
if(b==NULL)
return;
Middigui(b->lchild);
cout<
Middigui(b->rchild);
}
voidLastdigui(bitree*b)//递归后序遍历
{
if(b==NULL)
return;
Lastdigui(b->lchild);
Lastdigui(b->rchild);
cout<
}
voidpretree(bitree*boot){//前序遍历函数,传入二叉树根节点指针;
inttop=-1;
bitree*s[maxsize],*bt=boot;
while((bt!
=NULL)||(top!
=-1)){
while(bt!
=NULL){
cout<
s[++top]=bt;
bt=bt->lchild;//指针指向左孩子;
}
if(top!
=-1){
bt=s[top--];bt=bt->rchild;//指针指向右孩子;
}
}
}
voidmidtree(bitree*boot){//中序遍历函数,传入二叉树根节点指针;
inttop=-1;
bitree*s[maxsize],*bt=boot;
while((bt!
=NULL)||(top!
=-1)){
while(bt!
=NULL){
s[++top]=bt;
bt=bt->lchild;//指针指向左孩子;
}
if(top>-1){
bt=s[top--];
cout<
bt=bt->rchild;//指针指向右孩子;
}
}
}
voidbacktree(bitree*boot){//后序遍历函数,传入二叉树根节点指针
bitree*s[maxsize],*pre=NULL,*bt=boot;
inttop=-1;
while((bt!
=NULL)||(top!
=-1)){//如果根节点非空或堆栈非空;
while(bt!
=NULL){
s[++top]=bt;//存入堆栈,栈顶指针++;
bt=bt->lchild;//指针指向左孩子;
}
if(top>-1){
bt=s[top];
if(bt->rchild!
=NULL&&bt->rchild!
=pre){//如果非空;
bt=bt->rchild;//指针指向右孩子;
}
else{
cout<
pre=bt;
bt=NULL;
top--;
}
}
}
}
voidleveltree(bitree*boot){//层次遍历函数,传入二叉树根节点指针;
bitree*s[maxsize],*bt=boot;
intrear=0,front=0;
s[rear++]=bt;
while(rear!
=front){//循环队列非空
bt=s[front];
front=(front+1)%maxsize;//循环队列出对
cout<
if(bt->lchild!
=NULL){
s[rear]=bt->lchild;//指针指向左孩子,把数据存入a[];
rear=(rear+1)%maxsize;//循环队列尾指针加一;
}
if(bt->rchild!
=NULL){
s[rear]=bt->rchild;//指针指向右孩子,数据存入a[];
rear=(rear+1)%maxsize;//循环队列尾指针加一;
}
}
}
voidmain(){//主函数
bitree*bt;//定义一个二叉树根节点指针
createbtree(bt,"6(3(5(3(,0)),0(,0)),1(7(,1
(1)),0))#");//以学号为数据建树
cout<<"嵌套表示法"< printree(bt); cout< cout<<"递归: "< cout<<"前序遍历: "; Predigui(bt); cout< cout<<"中序遍历: "; Middigui(bt); cout< cout<<"后序遍历: "; Lastdigui(bt); cout< cout<<"非递归: "< cout<<"前序: "< pretree(bt);//前序打印二叉树 cout< cout<<"中序: "< midtree(bt);//中序打印二叉树 cout< cout<<"后序: "< backtree(bt);//后序打印二叉树 cout< cout<<"层次: "< leveltree(bt);//层次打印二叉树 cout< 七、设计感想 通过这次实验使我对二叉树的两种遍历格式和三种遍历方法有了进一步的了解,熟悉了二叉树的基本操作,掌握了二叉树的实现以及实际的应用,加深了对二叉树的理解,逐步培养解决实际问题的编程能力和如何使用递归方法和,使我跟深刻的认识到了二叉树的遍历,所谓二叉树的遍历,是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。 访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础,同时知道了如果知道了一棵树的先序遍历和中序遍历或者同时知道后序遍历和中序遍历,就能确定一棵二叉树,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 重庆 交通大学 数据结构 课程设计 遍历 算法 实验 报告