C语言综合实验设计报告数据结构二叉树的遍历Word格式文档下载.docx
《C语言综合实验设计报告数据结构二叉树的遍历Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言综合实验设计报告数据结构二叉树的遍历Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
再用图形显示创建好的树,进行先序,中序,后序遍历。
遍历时显示每个结点的过程。
最后关闭图形。
三主要问题的解决方法及技术关键
_存在的主要问题是在手动创建树时怎样输入结点,当选择“人工手动建立”时,在提示后依次输入26个字符或数字,每行一个。
此时树就能建立,然后用图形显示出来。
本程序的技术关键是建立二叉树和图形显示遍历的过程,分别用到Tree*CreatTree(),VoidDrawTree(Tree*t)等函数。
遍历结束后,图形关闭。
四流程图
五程序清单
/********tree2.c二叉树演示********/
#include<
graphics.h>
stdio.h>
stdlib.h>
dos.h>
time.h>
typedefstructTREE
{
chardata;
/*树的结点数据*/
structTREE*lchild;
structTREE*rchild;
intx;
/*树的x坐标*/
inty;
/*树的y坐标*/
}Tree;
structOUTPUT
/*三种遍历的x坐标*/
/*三种遍历的y坐标*/
intnum;
}s;
intnodeNUM=0;
/*统计当前的结点数字,最多26个*/
charway;
/*自动建立树和手动建立树的标志,2手动,1自动*/
charstr[3];
/*显示结点数据的字符串*/
voidInit();
/*图形初始化*/
voidClose();
/*图形关闭*/
Tree*CreatTree();
/*文本模式下创建树的过程*/
Tree*InitTree(inth,intt,intw);
/*创建树,h层次,t横坐标,w树之间的宽度,n树的建立方式*/
voidDrawTree(Tree*t);
/*用图形显示创建好的树*/
voidPreorder(Tree*t);
/*前序遍历*/
voidMidorder(Tree*t);
/*中序遍历*/
voidPosorder(Tree*t);
/*后序遍历*/
voidDrawNode(Tree*t,intcolor);
/*遍历时显示每个结点的过程*/
voidClrScr();
/*清空树的区域*/
voidmain()
Tree*root;
randomize();
root=CreatTree();
/*创建树*/
Init();
DrawTree(root);
/*每次遍历前显示白色的树*/
sleep
(1);
s.x=100;
s.y=300;
s.num=1;
/*每次遍历前设置显示遍历顺序显示的x,y坐标*/
Preorder(root);
getch();
ClrScr();
s.y=350;
s.num=1;
Midorder(root);
s.y=400;
Posorder(root);
Close();
}
voidClrScr()
setcolor(BLACK);
setfillstyle(SOLID_FILL,BLACK);
bar(0,20,640,280);
Tree*CreatTree()
clrscr();
printf("
pleaseinputn\n"
);
putercreat\n"
2.peoplecreat\n"
way=getch();
/*输入创建树的方法,1电脑自动建立,2人工手动建立*/
if(way!
='
2'
)
way='
1'
;
/*其他数字默认自动建立*/
if(way=='
)/*手动建立提示输入结点*/
Pleasecreatthetree\n"
root=InitTree(1,320,150);
system("
pause"
returnroot;
/*生成二叉树,h表示层次,t表示横坐标,w表示结点左右子树的宽度,随机数n确定结点是空或非空,如n为0,则为空*,但要限定确保结点数不少于三个*/
Tree*InitTree(inth,intt,intw)
charch;
intn;
/*自动建立时随机赋值判断是否是NULL的标志*/
Tree*node;
)/*手动建立需要自己输入*/
scanf("
%c"
&
ch);
else/*自动建立的赋值*/
{
n=random(5);
if(n==0&
&
nodeNUM>
=3)/*随机赋值时候确保自动建立的二叉树有三个结点*/
ch='
.'
else
ch=65+random(25);
}
if(ch=='
)/*输入空格代表NULL*/
returnNULL;
if(h==6||nodeNUM==26)/*如果树的层次已经到5或者结点树到达26个就自动返回NULL*/
node=(Tree*)malloc(sizeof(Tree));
node->
data=ch;
x=t;
/*树的x坐标是传递过来的横坐标*/
y=h*50;
/*树的y坐标与层次大小有关*/
nodeNUM++;
lchild=InitTree(h+1,t-w,w/2);
rchild=InitTree(h+1,t+w,w/2);
returnnode;
voidDrawTree(Tree*t)
if(t!
=NULL)
fillellipse(t->
x,t->
y,9,9);
setcolor(WHITE);
circle(t->
y,10);
/*画圆*/
sprintf(str,"
t->
data);
/*将内容转换成字符串输出*/
outtextxy(t->
x-3,t->
y-2,str);
if(t->
lchild!
=NULL)/*左子树*/
line(t->
x-5,t->
y+12,t->
lchild->
x+5,t->
y-12);
DrawTree(t->
lchild);
rchild!
=NULL)/*右子树*/
rchild->
rchild);
voidDrawNode(Tree*t,intcolor)
setcolor(YELLOW);
setfillstyle(SOLID_FILL,YELLOW);
y,10,10);
setcolor(RED);
setcolor(color);
outtextxy(s.x,s.y,str);
%d"
s.num);
/*将遍历次序用数字显示在树的结点上*/
y-20,str);
s.num++;
voidPreorder(Tree*t)
s.x+=15;
DrawNode(t,GREEN);
Preorder(t->
voidMidorder(Tree*t)
Midorder(t->
DrawNode(t,YELLOW);
voidPosorder(Tree*t)
Posorder(t->
DrawNode(t,BLUE);
voidInit()
intgd=DETECT,gm;
initgraph(&
gd,&
gm,"
c:
\\tc"
cleardevice();
outtextxy(250,10,"
anykeytocontinue"
outtextxy(20,300,"
preorder"
outtextxy(20,350,"
midorder"
outtextxy(20,400,"
posorder"
voidClose()
closegraph();
六设计结果说明
本程序主函数简洁易懂,用了坐标设定树结点的位置,使运算方便。
设置了选择功能,其中自动创建起着示范作用,还显示出程序的自动化程度。
调用了众多功能函数,且函数表达较详细。
用图形显示了遍历的经过使人更好地明白二叉树的遍历。
不足的是在手动建立树时,没有清楚说明运用的变量的性质,让使用者在输入数据时产生疑惑,且有些具体函数的作用没有很好的体现。