1411 自己排序的二叉树

来源:互联网 发布:php 获取上传图片类型 编辑:程序博客网 时间:2024/06/17 13:54
 
描述

经过前两周的练习,你的自己写的排序二叉树的应该至少能够支持如下操作:

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;}elsecontinue;}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]);}}