题面,没打LaTeX N个操作,分别对应插入(I)一个数和删除(D)一个数,如果插入的数已存在,输出has been,否则将这个数插入,并输出insert success,对于删除一个数,如果该数不存在,输出not exist,如果存在,删除它,并输出delete success
BST:
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct BST{
int val=0,l=0,r=0;
}a[100001];
int tot,root=1;
int find_(int p,int x){
if(p==0)return -1;
if(x==a[p].val)return p;
if(x<a[p].val)return find_(a[p].l,x);
else return find_(a[p].r,x);
}
int find(int x){return find_(root,x);}
void insert_(int &p,int x){
if(p==0){
a[++tot].val=x;
p=tot;
return;
}
if(x<a[p].val)insert_(a[p].l,x);
else insert_(a[p].r,x);
}
void insert(int x){insert_(root,x);}
void dele_(int &p,int x){
if(p==0)return;
if(x==a[p].val){
if(a[p].l==0)p=a[p].r;
else if(a[p].r==0)p=a[p].l;
else{
int nxt=a[p].r;
while(nxt)nxt=a[nxt].l;
dele_(a[p].r,a[nxt].val);
a[nxt].l=a[p].l,a[nxt].r=a[p].r;
p=nxt;
}
return;
}
if(x<a[p].val)dele_(a[p].l,x);
else dele_(a[p].r,x);
return ;
}
void dele(int x){dele_(root,x);}
signed main(){
a[1].val=1e16,a[2].val=-1e16,a[1].l=2;tot=2;
int n;
scanf("%lld",&n);
while(n--){
char x;
int p;
cin>>x>>p;
if(x=='I'){
if(find(p)!=-1){
puts("has been");
}else{
puts("insert success");
insert(p);
}
}else{
if(find(p)==-1){
puts("not exist");
}else{
puts("delete success");
dele(p);
}
}
}
return 0;
}