Problem Description
根据输入的int数组建立一棵二叉排序树,然后根据指令进行相应的操作。指令只有两种Insert x, Delete x。不考虑空树的情况。
Insert x 指令需要你将x插入到建好的二叉排序树中(允许存在相同元素)。
Delete x 指令需要你将值为x的结点删除(只删除一个,而且不保证x一定在二叉排序树中)。
Input Description
第一行为测试数据的组数n, 下面有n组测试数据。对于每组测试数据,第一行为用空格隔开的int数列,数量不超过1000,你需要用这个数据初始化一棵排序二叉树,下面一行为指令数m, 接下来的m行为m个指令。格式按照题目描述。数据均为int型。
Output Description
输出一共有n行,对应每组测试数据,在所有的指令都执行完后,把当前的排序二叉树中序输出,元素之间用空格隔开。
Sample Input
1 1 3 5 2 2 Insert 4 Delete 5
Sample Output
1 2 3 4
#include<stdio.h>
#include<stdlib.h>
typedef struct Twotree{
int data;
struct Twotree * right;
struct Twotree * left;
}Twotree;
Twotree *insert(Twotree *tree, int n)
{
if(tree == NULL)
{
Twotree *new_node = (Twotree *)malloc(sizeof(Twotree));
new_node->data = n;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}
if(n >= tree->data)
{
tree->right = insert(tree->right, n);
}
else
{
tree->left = insert(tree->left, n);
}
return tree;
}
//中序(遍历得到的就是顺序的)
void midorder(Twotree * Tree)
{
if(Tree == NULL)
{
return;
}
midorder(Tree->left);
printf("%d ", Tree->data);
midorder(Tree->right);
}
Twotree* minValueNode(Twotree* node)
{
Twotree* current = node;
while (current && current->left != NULL)
{
current = current->left;
}
return current;
}
Twotree* deleteNode(Twotree * root, int data)
{
if (root == NULL)
return root;
if (data < root->data)
{
root->left = deleteNode(root->left, data);
}
else if (data > root->data)
{
root->right = deleteNode(root->right, data);
}
else //相等情况
{
if (root->left == NULL)
{
Twotree* temp = root->right;
free(root);
return temp;
}
else if (root->right == NULL)
{
Twotree* temp = root->left;
free(root);
return temp;
}
Twotree* temp = minValueNode(root->right);
root->data = temp->data;
root->right = deleteNode(root->right, temp->data);
}
return root;
}
int main()
{
int m;
scanf("%d", &m);
for(int i = 0; i < m; i++)
{
Twotree * tree;
tree = NULL;
while(1)
{
int data;
char c;
scanf("%d", &data);
tree = insert(tree, data);
scanf("%c", &c);
if(c == '\n')
{
break;
}
}
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
char order[10];
scanf("%s", order);
int data;
if(order[0] == 'I')
{
scanf("%d", &data);
tree = insert(tree, data);
}
else if(order[0] == 'D')
{
scanf("%d", &data);
deleteNode(tree, data);
}
}
midorder(tree);
}
return 0;
}