#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pi acos(-1.0)
#define e exp(1.0)
struct node
{
int val;
node *lch,*rch;
};
node *root=NULL;
node *Insert(node *p,int x)
{
if(p==NULL)
{
node *q=new node;
q->val=x;
q->lch=q->rch=NULL;
return q;
}
else
{
if(x<p->val)
p->lch=Insert(p->lch,x);
else if(x>p->val)
p->rch=Insert(p->rch,x);
return p;
}
}
bool Find(node *p,int x)
{
if(p==NULL)
return false;
else if(x==p->val)
return true;
else if(x<p->val)
return Find(p->lch,x);
else
return Find(p->rch,x);
}
node *Delete(node *p,int x)
{
if(p==NULL)
return NULL;
else if(x<p->val)
p->lch=Delete(p->lch,x);
else if(x>p->val)
p->rch=Delete(p->rch,x);
else
{
if(p->lch==NULL&&p->rch==NULL)//如果左右子树为空,直接删除掉
delete p;
else if(p->lch==NULL)//如果左子树为空,将右儿子提上去
{
node *q=p;
p=p->rch;
delete q;
}
else if(p->lch->rch==NULL)//如果左儿子没有右子树,将左儿子提上去
{
node *q=p->lch;
q->rch=p->rch;
delete p;
return q;
}
else//否则,找左子树的最右孩子
{
node *q=p->lch;
for(;q->rch->rch!=NULL;q=q->rch);
node *r=q->rch;
q->rch=r->lch;
r->rch=p->rch;
r->lch=p->lch;
q->rch=NULL;
delete p;
return r;
}
}
return p;
}
int main()
{
// freopen(".../.txt","w",stdout);
ios::sync_with_stdio(false);
ll N,i,j,M,n;
cin>>N>>M;
for(i=1;i<=N;i++)
{
cin>>n;
// if(n==1)
root=Insert(root,n);
// else
// Insert(root,n);
}
for(i=1;i<=M;i++)
{
string s;
cin>>s;
if(s=="Insert")
{
cin>>n;
Insert(root,n);
}
else if(s=="Find")
{
cin>>n;
if(Find(root,n))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
else
{
cin>>n;
Delete(root,n);
}
}
return 0;
}
二叉搜索树的实现
最新推荐文章于 2024-07-17 21:15:05 发布