经过前两周的练习,你的自己写的排序二叉树的应该至少能够支持如下操作:
CreateBTree(T []); //从某种类型的数组建立一棵排序二叉树,这种类型的值可比较大小
Travel(); //中序遍历这棵排序二叉树。
Insert(T); //插入一个数据T
现在需要你写一个Delete(T)函数,删除这棵排序二叉树中值为T的结点,如果有多个值,只删除一个,删除后仍保持排序二叉树的性质。(注意,不是删除以T为节点的子树,而是只删除这个值)
现在我们帮你做单元测试,以便了解你自己写的二叉排序树在逻辑上是否正确。
首先,我们会给出一个int 数组,你需要根据这个int 数组建立一棵二叉排序树,下面我们会给出N条指令,指令只有两种Insert x, Delete x. Insert x 指令需要你将x插入到建好的二叉排序树中,Delete x指令需要你将值为x的结点删除(只删除一个,而且不保证x一定在二叉排序树中),注意本题查代码(7)
- 输入
-
第一行为测试数据的组数n, 下面有n组测试数据。对于每组测试数据,第一行为用逗号隔开的int数列,你需要用这个数据初始化一棵排序二叉树,下面一行为指令数m, 格式按照题目描述。数据均为int型。
- 输出
-
输出一共有n行,对应每组测试数据,在所有的指令都执行完后,把当前的排序二叉树中序输出,元素之间用空格隔开。
- 样例输入
-
1
-
1,3,5,2
-
2
-
Insert 4
-
Delete 5
- 样例输出
-
1,2,3,4
此题用数组可以模拟
#include <stdio.h> #include <string.h> char s[1000]; main() { int number; int length,i,j; int p; int a[1000]; int up; int temp; int count; char op; scanf("%d",&number); getchar(); while(number--) { up=0; gets(s); length=strlen(s); i=0; p=0; for(i=0;i<length;i++) { if(s[i]!=',') { p=0; while(s[i] >= '0' && s[i] <= '9'&&i<length) { p = p * 10 + s[i] - '0'; i++; } a[up++]=p; } else continue; } scanf("%d",&count); while(count--) { getchar(); scanf("%c",&op); if(op=='I') { for(i=0;i<6;i++) scanf("%c",&op); scanf("%d",&temp); a[up++]=temp; } if(op=='D') { for(i=0;i<6;i++) scanf("%c",&op); scanf("%d",&temp); for(j=0;j<up;j++) { if(a[j]==temp) { for(p=j;p<up-1;p++) a[p]=a[p+1]; up--; } } } } for(i=0;i<up;i++) for(j=i+1;j<up;j++) { if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } for(i=0;i<up-1;i++) printf("%d,",a[i]); printf("%d\n",a[up-1]); } }