题目要求
编写一个c程序,要求在c程序图形界面下动态模拟显示二叉树的先序创建过程。
题目分析
为了动态地显示二叉树的先序创建过程,首先要在内存中生成一棵真正的二叉树,然后对二叉树进行先序遍历,每遍历到一个结点就将该结点的内容输出到界面上,打印出一个结点的图案。在遍历二叉树的过程中,要根据二叉树的结点所在该二叉树中的位置的不同,设置图形界面中对应结点的图案的位置。另外,还有结点之间的线。
程序如下:
#include"stdio.h"
#include<conio.h>
#include<graphics.h>
typedef struct BiTNode{
char data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
creatBiTree(BiTree *T)
{
char c;
gotoxy(5,5); //将光标移动到指定位置,前参为列
printf("Please input chareter to creat a BiTree\n");
scanf("%c",&c);
if(c==' ')
*T=NULL;
else
{
*T=(BiTNode *)malloc(sizeof(BiTNode));
(*T)->data=c;
creatBiTree(&((*T)->lchild));
creatBiTree(&((*T)->rchild));
}
}
printtree(BiTree T,int x,int y)
{
char e[2]={'\0','\0'};
if(T)
{ //递归结束条件,T为空
{//画出一个结点,程序暂停两秒
e[0]=T->data;
circle(x,y,8);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
outtextxy(x,y,e);
sleep(2);
}
if(printtree(T->lchild,x-(200-y),y+20))
line(x,y,x+(200-y),y+20);
if(printtree(T->child,x-(200-y),y+20))
line(x,y,x+(200-y),y+20);
return 1;
}
return 0;
}
main()
{
BiTree T=NULL;
int y=100,x=350; //设置二叉树根结点坐标
int GraphDriver=DETECT;
int GraphMode;
int color;
color=RED;
//初始化图形系统,驱动文件"\\tc\\bgi"的路径不能设置错误
initgraph(&GraphDriver,&GraphMode,"\\tc\\bgi");
setcolor(color);//设置图形颜色:红色
creatBiTree(&T);
printtree(T,x,y);
getche();
closegraph();
}
算法分析:
circle()的功能是画一个以(x,y)圆心,e为半径的圆
settextstyle()的功能是设置输出字符的大小,字体等。
outtextxy()的功能是在屏幕的(x,y)的坐标位置上输出结点中包含的字符
sleep()的功能是将程序挂起两秒。
line()作用是画出结点之间的连线(划线的条件:根结点和子树同在)
本程序绘图规律:画出根结点->画出左子树->画出根结点与左子树间的连线->画出右子树->画出根结点与右子树连线。
注意:本程序在 Tubro C 下才可运行,因为代码中包含了Tubro C 中的图形函数库。