数据结构2叉数遍历.docx
- 文档编号:4686544
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:15
- 大小:316.89KB
数据结构2叉数遍历.docx
《数据结构2叉数遍历.docx》由会员分享,可在线阅读,更多相关《数据结构2叉数遍历.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构2叉数遍历
内蒙古工业大学信息工程学院
实验报告
课程名称:
数据结构与算法
实验名称:
二叉树遍历算法的设计
实验类型:
验证性√综合性□设计性□
实验室名称:
***
班级:
**学号:
**
姓名:
**组别:
同组人:
成绩:
实验日期:
2013-9-24
实验报告撰写要求
一、实验前用预习报告纸撰写预习报告,预习报告包括以下内容
1.实验目的
2.实验用仪器设备、器材或软件环境
3.实验原理、方案设计、程序框图、预编程序等
4.实验过程中需要记录的实验数据表格
二、实验过程中,要认真观察,仔细记录
三、完成实验后用实验报告纸撰写实验报告,包括以下内容
1.仪器设备型号及编号
2.实验器材或软件环境
3.实验步骤、程序调试方法
4.实验数据处理及结果分析
5.实验中存在的问题
6.体会及思考题
四、报告撰写时,要求格式规范、书写整齐
预习报告成绩:
指导教师审核(签名):
年月
预习报告
实验二二叉树遍历算法的设计
一、目的
本实验的目的是理解二叉树的逻辑结构和二叉链表存储结构,进一步提高使用理论知识指导解决实际问题的能力,并对算法性能进行分析。
二、题目
二叉树遍历算法的设计。
三、实验类型
设计性。
方案一采用递归算法实现二叉树遍历算法。
方案二采用非递归算法实现二叉树遍历算法。
四、要求及提示
要求:
(1)两种算法以及各种基本操作(创建二叉树)定义为独立函数(注意函数接口的规定)。
(2)采用菜单驱动方式调用各种功能。
(3)用测试数据测试程序的正确性,如下面的二叉树:
(4)对同一棵二叉树,分别调用两种算法,单步跟综递归程序的执行过程并观察调用堆栈。
(5)分析算法的时间复杂度。
提示:
二叉链表可以采用数据类型定义:
typedefstructnode
{datatypedata;//每个结点的数据域
structnode*lchild,*rchild;
//结点的左孩子指针域lchild,右孩子指针域rchild
}BinNode;
五、实验报告
1、写出每个算法的思想和关键代码。
2、画出算法流程图。
3、调试程序出现的问题及解决的方法。
4、报告给出测试的结果并写出设计体会。
5、列表对比分析两种算法的时间复杂度、空间复杂度,阐明产生差异的原因。
6、根据实例归纳将递归算法改写为非递归算法的步骤。
一:
流程图
先序遍历流程图:
中序遍历流程图:
后序遍历流程图:
递归代码:
#include
#include
#include
typedefstructnode
{chardata;structnode*lchild,*rchild;
}BinNode;
BinNode*createbn()
{BinNode*q;structnode*m[30];intj,i,x;
printf("建立二叉树,输入结点对应的编号和值\n");
printf("i,x=");
scanf("%d,%c",&i,&x);
while(i!
=0&&x!
=0)
{q=(BinNode*)malloc(sizeof(BinNode));
q->data=x;
q->lchild=NULL;
q->rchild=NULL;
m[i]=q;
if(i!
=1)
{j=i/2;if(i%2==0)m[j]->lchild=q;
elsem[j]->rchild=q;
}
printf("i,x=");
scanf("%d,%c",&i,&x);
}
returnm[1];
}
voidBinNodePreorder(BinNode*bn)
{if(bn!
=NULL)
{printf("%c",bn->data);
BinNodePreorder(bn->lchild);
BinNodePreorder(bn->rchild);
}
}
voidBinNodeInorder(BinNode*bn)
{if(bn!
=NULL)
{BinNodeInorder(bn->lchild);
printf("%c",bn->data);
BinNodeInorder(bn->rchild);
}
}
voidBinNodePastorder(BinNode*bn)
{
if(bn!
=NULL)
{BinNodeInorder(bn->lchild);
BinNodeInorder(bn->rchild);
printf("%c",bn->data);
}
}
voidmain()
{BinNode*bn;
intselect;
while(select)
{
printf("1.建立二叉树\n");
printf("2.二叉树的前序遍历\n");
printf("3.二叉树的中序遍历\n");
printf("4.二叉树的后序遍历\n");
printf("0.结束程序\n");
scanf("%d",&select);
switch(select)
{case1:
printf("输入二叉树的结点值\n");
getchar();
bn=createbn();
printf("二叉树已建立完成!
!
\n");
break;
case2:
printf("该二叉树前序遍历序列为:
");
BinNodePreorder(bn);
printf("\n");
break;
case3:
printf("该二叉树中序遍历序列为:
");
BinNodeInorder(bn);
printf("\n");
break;
case4:
printf("该二叉树后序遍历序列为:
");
BinNodePastorder(bn);
printf("\n");
break;
case0:
;
}
}
}
实验结果:
非递归代码:
#include
#include
#include
#defineMAXNUM100
typedefstructnode
{intdata;structnode*lchild,*rchild;
}BinNode;
BinNode*createbn()
{BinNode*q;structnode*m[30];intj,i,x;
printf("输入结点对应的编号和值\n");
printf("二叉树编号i=");
scanf("%d",&i);printf("\n");
printf("节点的值X=");
scanf("%d",&x);printf("\n");
while(i!
=0&&x!
=0)
{q=(BinNode*)malloc(sizeof(BinNode));
q->data=x;q->lchild=NULL;q->rchild=NULL;m[i]=q;
if(i!
=1)
{j=i/2;if(i%2==0)m[j]->lchild=q;
elsem[j]->rchild=q;
}printf("二叉树编号i=");
scanf("%d",&i);
printf("\n");
printf("节点的值x=");
scanf("%d",&x);
printf("\n");
}
returnm[1];
}
voidBinNodePreorder(BinNode*bn)
{BinNode*stack[MAXNUM],*q;
inttop=1;
stack[top]=bn;
while(top>=0)
{q=stack[top];
top--;
if(q!
=NULL)
{
printf("%d",q->data);
top++;
stack[top]=q->rchild;
top++;
stack[top]=q->lchild;
}
}
}
voidBinNodeInorder(BinNode*bn)
{BinNode*stack[MAXNUM];
inttop=0;
stack[top]=bn;
do
{
while(stack[top]!
=NULL)
{top=top+1;
stack[top]=stack[top-1]->lchild;
}
top=top-1;
if(top>=0)
{printf("%d",stack[top]->data);
stack[top]=stack[top]->rchild;
}
}while(top>=0);
}
voidBinNodePastorder(BinNode*bn)
{BinNode*stack[MAXNUM];
inttag[MAXNUM];
inttop=0;
BinNode*n;
n=bn;
do
{
while(n!
=NULL)
{top++;
stack[top]=n;
tag[top]=0;
n=n->lchild;
}
if(top>=0)
{n=stack[top];
if(tag[top]==1)
{
printf("%d",stack[top]->data);
top--;
n=stack[top];
}
if(top>0)
{
if(tag[top]!
=1)
{n=n->rchild;
tag[top]=1;
}
elsen=NULL;
}
}
}while(top!
=0);
}
voidmain()
{BinNode*bn;
intselect;
while(select)
{
//printf("二叉树的建立和非递归遍历\n");
printf("1.建立二叉树\n");
printf("2.二叉树的前序遍历\n");
printf("3.二叉树的中序遍历\n");
printf("4.二叉树的后序遍历\n");
printf("0.结束程序\n");
scanf("%d",&select);
switch(select)
{
case1:
printf("输入二叉树的结点值\n");
getchar();
bn=createbn();
printf("建立完成...\n");
break;
case2:
printf("二叉树前序遍历序列为:
");
BinNodePreorder(bn);
printf("\n");
break;
case3:
printf("二叉树中序遍历序列为:
");
BinNodeInorder(bn);
printf("\n");
break;
case4:
printf("二叉树后序遍历序列为:
");
BinNodePastorder(bn);
printf("\n");
break;
case0:
;
}
}
}
实验结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 遍历