《数据结构》上机实验报告模版Word下载.docx
《《数据结构》上机实验报告模版Word下载.docx》由会员分享,可在线阅读,更多相关《《数据结构》上机实验报告模版Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
实验地点:
6308
实验时间:
实验成绩:
评阅老师:
一【上机实验目的】
1.掌握二叉树的概念,包括二叉树、满二叉树和完全二叉树的定义。
2.掌握二叉树的性质。
3.重点掌握二叉树的存储结构,包括二叉树顺序存储结构和链式存储结构。
4.重点掌握二叉树的基本运算和各种遍历算法的实现。
二【实验环境】
PC机1台,,VC++6.0,easyX图形库
三【上机实验内容】
四【上机调试程序流程图】
(用传统流程图的形式表示)
五【上机调试中出现的错误信息、错误原因及解决办法】
非递归后序遍历时出现了问题,不能遍历非完全二叉树,后来用到,右孩子不存在或者已经访问过,root出栈并访问,否则,不出栈,继续访问右孩子
层次遍历是开始想的是用栈来实现,但是很麻烦,还有问题,后来用队列,解决了问题
六【上机调试后的源程序及还存在的问题】
#include<
stdio.h>
#defineMAXN100
windows.h>
graphics.h>
structBTNode
{
chartag;
BTNode*left;
BTNode*right;
};
//二叉树结点
intX[10]={75};
intY[10]={20};
//动画演示的坐标
charB[21]={'
A'
'
B'
C'
#'
D'
E'
F'
G'
H'
I'
J'
//固定动画演示的
charC[10]={'
intxx[10]={325};
//输出结果的横坐标
intflag=0;
//标记是否进行动画演示,0代表“不”,1代表“要”
voidcreatree(BTNode**root)//动画演示先序构造二叉树
staticii=0;
if(B[ii]=='
)
{
*root=NULL;
ii++;
}
else
*root=newBTNode;
(*root)->
tag=B[ii];
creatree(&
(*root)->
left);
creatree(&
right);
}
/*先序方式创建二叉树*/
voidBuildBTree(BTNode**root)
charc;
c=getchar();
if(c=='
tag=c;
BuildBTree(&
BuildBTree(&
voidPreVisit(BTNode*root)//递归前序遍历
if(root!
=NULL)
if(flag==0)//不动画演示
{
printf("
%c"
root->
tag);
}
else//动画演示
for(inti=0;
i<
10;
i++)
{
if(C[i]==root->
tag)
{
setcolor(GREEN);
fillcircle(X[i],Y[i],15);
setbkmode(TRANSPARENT);
setfont(20,20,"
宋体"
);
outtextxy(X[i]-10,Y[i]-7,C[i]);
setbkmode(OPAQUE);
outtextxy(xx[ii],400,C[i]);
ii++;
break;
}
}
Sleep(1500);
PreVisit(root->
voidInVisit(BTNode*root)//递归中序遍历
InVisit(root->
if(flag==0)
else
setcolor(500);
voidPostVisit(BTNode*root)//递归后序遍历
PostVisit(root->
voidNR_PreVisit(BTNode*root)//非递归前序遍历
BTNode*s[MAXN];
//栈
inttop=0;
//头指针
while(top!
=0||root!
=NULL)//如果结点不为空或栈不为空
while(root!
=NULL)//如果结点不为空
s[top]=root;
//压栈
s[top]->
tag);
//输出结点
top++;
root=root->
left;
//指向左孩子
if(top>
0)//如果栈不为空
top--;
//出栈
root=s[top];
root=root->
right;
//指向右孩子
voidNR_InVisit(BTNode*root)//非递归中序遍历
{
//栈
//头指针
=0||root!
=NULL)//如果结点不为空
s[top++]=root;
//压栈
//指向左孩子
root=s[--top];
voidNR_PostVisit(BTNode*root)//非递归后序遍历
BTNode*s[MAXN],*tmp=NULL;
s[top++]=root;
root=root->
0)
root=s[--top];
/*右孩子不存在或者已经访问过,root出栈并访问*/
if((root->
right==NULL)||(root->
right==tmp))
printf("
tmp=root;
//保存root指针
root=NULL;
//当前指针置空,防止再次入栈
/*不出栈,继续访问右孩子*/
top++;
//与root=s[--top]保持平衡
root=root->
voidCengci(BTNode*root)/*按层次遍历*/
BTNode*V[MAXN],*p;
intfront=0,area=0;
//队列
if(root!
area++;
V[area]=root;
while(front<
area)
front++;
p=V[front];
if(flag==0)
p->
else
for(inti=0;
if(C[i]==p->
{
setcolor(500);
fillcircle(X[i],Y[i],15);
setbkmode(TRANSPARENT);
setfont(20,20,"
outtextxy(X[i]-10,Y[i]-7,C[i]);