/*-------------------
输入:
5
66 99 33 22 11
3
33 5 11
输出
11 22 33 66 99
1
11 22 66 99
0
11 22 66 99
1
22 66 99
任务是输入N个数,建立一颗BST二叉搜索树,查找删除其中的一些元素,再中序遍历
如果找到了,删除并返回1,如果没找到,返回0;
-------------------*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=10000+10;
struct node{
int x;
struct node *f,*l,*r;
node(){
f=NULL;l=NULL;r=NULL;
}
};
void insert(struct node *p,int k){
struct node *q;
if(k>=p->x){
if(p->r==NULL){
q=new node;
q->x=k;
p->r=q;
q->f=p;
}else insert(p->r,k);
}else{
if(p->l==NULL){
q=new node;
q->x=k;
p->l=q;
q->f=p;
}else insert(p->l,k);
}
}
void zx(struct node *p){
if(p->l!=NULL)zx(p->l);
printf("%d ",p->x);
if(p->r!=NULL)zx(p->r);
}
int find(struct node *p,int k){
struct node *q,*t;
if(p->x==k){
if(p->l==NULL && p->r==NULL){
if(p==p->f->l)
p->f->l=NULL;
else
p->f->r=NULL;
free(p);
}else if(p->l==NULL && p->r!=NULL){
q=p;t=p->f;
if(p==t->l)t->l=p->r;
else t->r=p->r;
p->r->f=t;
free(q);
}else if(p->r==NULL && p->l!=NULL){
q=p;t=p->f;
if(p==t->l)t->l=p->l;
else t->r=p->l;
p->l->f=t;
free(q);
}else{
q=p->l;
while(q->r!=NULL)q=q->r;
p->x=q->x;
if(q->l==NULL && q->r==NULL){
if(q==q->f->l)
q->f->l=NULL;
else
q->f->r=NULL;
free(q);
}else if(q->l!=NULL){
p=q;t=q->f;
if(q==t->l)t->l=q->l;
else t->r=q->l;
q->l->f=t;
free(p);
}
}
return 1;
}
if(p->x>k){
if(p->l==NULL)return 0;
else return find(p->l,k);
}else if (p->x<k){
if(p->r==NULL)return 0;
else return find(p->r,k);
}
}
int main(){
int i,j,k,m,n,len,tmp,p;
int ans=0;
struct node *h;
scanf("%d",&n);
scanf("%d",&k);
h=new node;
h->x=k;
for(i=2;i<=n;i++){
scanf("%d",&k);
insert(h,k);
}
zx(h);
puts("");
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d",&k);
printf("%d\n",find(h,k));
zx(h);
}
system("pause");
return 0;
}