为了存储和管理输入数据,增加两个与数组相关的函数
//产生n个不重复的随机数
void Createnum(int n, int *num)
{
int vol, i, j, flag;
//产生随机数,存储在num数组中
for (i = 0; i<n; i++)
{
vol = rand() % 100;
flag = 1;
//判断生成的数是否重复
for (j = 0; j < i; j++)
{
if (vol == num[j]){ flag = 0; break; }
}
if (flag) num[i] = vol;
else --i;
} //生成100以内的整数
}
//将数组中的数输出
void show_num(int n, int *num)
{
int i;
for (i = 0; i<n; i++)
{
printf("%3d ", num[i]);
if ((i + 1) % 5 == 0) printf("\n");
} //输出生成的25个整数
}void main()
{
int x, y, g;
int i, a, b, c;
int num[100]; //输入n上限为100
int gdriver, gmode;
x = 320, y = 30, g = 0;
gdriver = DETECT;
while (1)
{
//创建二叉排序树
printf("随机生成多少数? ");
scanf_s("%d", &b);
srand(time(NULL)); //设置随机数
Createnum(b, num);
printf("所有随机数为:\n");
show_num(b, num);
printf("\n按任意键开始生成二叉排序树 ");
getchar();
T = Create(b, num);
if (T != NULL) printf("生成成功!");
else
{
printf("生成失败!");
break;
}
printf("\n前序遍历结果:(ENTER)");
getchar();
prorder(T);
//打印树形
printf("\n按任意键开始打印树形");
getchar();
// BGI 格式的初始化图形设备,长*宽,flag
initgraph(800, 550, 0);
setbkcolor(0); //设置背景颜色
cleardevice(); //清屏
Paint(T, x, y, g);
getchar();
closegraph(); //关闭窗口
//删除过后打印树形
printf("请输入要删除的数的序号: ");
scanf_s("%d", &a);
DeleteBT(&T, num[a - 1]);
initgraph(800, 550, 0);
setbkcolor(0); //设置背景颜色
cleardevice(); //清屏
Paint(T, x, y, g);
getchar();
getchar();
closegraph(); //关闭窗口
printf("前序遍历结果:(ENTER)");
getchar();
prorder(T);
printf("是否继续?");
scanf_s("%d", &c);
if (!c) break;
system("cls");
}
system("pause");
}
生成二叉树并打印出树的形状:


删除节点,输入序号是10,也就是上面输出数组的第十个元素,注意,这里的标号是从1开始的,所以删除了值为64的节点。


输出新的前序遍历结果,可以观察到与刚开始结果的变化,最后键入1重新开始,键入0结束。

由于画图操作中用到一些以前Dos界面上的函数,在VS2010等新版的环境中不支持(虽然我试了老版本的VC++等也不支持,但百度上是么说的)。建立二叉排序树这里需要安装一个EasyX的插件,这里附上下载链接:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-32053-3.html
没有一发炮弹击穿主装甲