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
Hint
本题必须用建立二叉排序树的方式做,会检查代码。
我的想法:
我的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
//二叉链表存储表示
typedef struct BSTNode
{
int data;
struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;
char buffer[100];
//二叉树的插入
void InsertBST(BSTree &T, int e)
{
if (!T)//如果该树为空
{
//创建新的节点
BSTree S = new BSTNode;
S->data = e;
S->lchild = S->rchild = NULL;
T = S;
}
else if (e < T->data)//在左边
{
InsertBST(T->lchild, e);
}
else if (e > T->data)
{
InsertBST(T->rchild, e);
}
}
void DeleteBST(BSTree &T, int key)
{
BSTree p = T;
BSTree f = NULL;
//从根查找关键字等于key的节点
while (p)
{
if (p->data == key)
{
break;
}
f = p;//记录上一个p值
if (key < p->data)
{
p = p->lchild;
}
else if (key > p->data)
{
p = p->rchild;
}
}
if (p == NULL)
{
return;
}
//三种情况:*p左右子树均不为空,无右子树,无左子树
BSTree q = p;
if (p->lchild && p->rchild)
{//左右子树均不为空
BSTree s = p->lchild;
while (s->rchild)
{
q = s;
s = s->rchild;//向右到尽头
}
p->data = s->data;//改变数据,s指向被删节点的前驱
if (q != p)
{
p->rchild = s->lchild;
}
else
{
q->lchild = s->lchild;
}
delete s;
return;
}
else if (!p->rchild)
{
p = p->lchild;
}
else if (!p->lchild)
{
p = p->rchild;
}
if (!f)
{
T = p;
}
else if (q == f->lchild)
{
f->lchild = p;
}
else
{
f->rchild = p;
}
delete q;
}
void Print(BSTree &T)
{
if (!T)
{
return;
}
Print(T->lchild);
printf("%d ", T->data);
Print(T->rchild);
}
int IsNum(char ch)
{
if (ch >= '0' && ch <= '9')
{
return 1;
}
return 0;
}
int GetNum(int &i)
{
int num = 0;
int n = 1;
while (IsNum(buffer[i]))
{
num = num * n + (buffer[i] - '0');
n = 10;
i++;
}
return num;
}
int main()
{
int n, k;//表示有n组测试数据
int elem;
BSTree T = NULL;
cin >> n;
getchar();
while (n--)
{
gets(buffer);
int length = strlen(buffer);
for (int i = 0; i < length; i++)
{
if (IsNum(buffer[i]))
{
int num = GetNum(i);
InsertBST(T, num);
}
}
cin >> k;
string str;
while (k--)
{
cin >> str;
if (str == "Insert")
{
cin >> elem;
InsertBST(T, elem);
}
else
{
cin >> elem;
DeleteBST(T, elem);
}
}
Print(T);
}
return 0;
}