//二叉查找树BST
const int maxn = 2e5 + 10;
int tot,root,INF=1<<30;
struct BST{
int l,r;
int val;
}a[maxn];
int New(int val){
a[++tot].val=val;
//a[tot].l=a[tot].r=0;
return tot;
}
void build(){
tot=0;
New(-INF),New(INF);
root=1,a[1].r=2;
}
int Get(int p,int val)//检索关键码为val的,p为根节点
{
if(p == 0) return 0;//检索失败
if(val == a[p].val) return p;//检索成功
return val<a[p].val ? Get(a[p].l,val) : Get(a[p].r,val);
}
void Insert(int &p,int val)//插入一个新值
{
if(p == 0){
p= New(val);//p是引用,其父节点的l或r会被同时更新
return ;
}
if(val == a[p].val) return;
if(val < a[p].val) Insert(a[p].l,val);
else Insert(a[p].r,val);
}
int GetNext(int val)//求后继
{
int ans=2;//a[2].val == INF
int p =root;
while(p){
if(val == a[p].val){//检索成功
if(a[p].r > 0){//有右子树
p = a[p].r;
while(a[p].l > 0) p=a[p].l;
ans = p;
}
break;
}
if(a[p].val > val && a[p].val <a[ans].val) ans=p;
p= val < a[p].val ? a[p].l : a[p].r;
}
return ans;
}
int GetPre(int val) //求前驱,自己写的,待检验
{
int ans=1;//a[1].val == -INF
int p=root;
while(p){
if(val == a[p].val){
if(a[p].l > 0){
p=a[p].l;
while(a[p].r > 0) p = a[p].r;
ans=p;
}
break;
}
if(a[p].val < val && a[p].val > a[ans].val) ans = p;
p = val > a[p].val ? a[p].r : a[p].l;
}
return ans;
}
void Remove(int val)
{
//检索val,得到节点p
int &p = root;
while(p){
if(val == a[p].val) break;
p = val < a[p].val ? a[p].l : a[p].r;
}
if(p == 0) return ;
if(a[p].l == 0){
p = a[p].r;
}
else if(a[p].r == 0){
p = a[p].l;
}
else{
int next = a[p].r;
while(a[next].l > 0) next = a[next].l;
Remove(a[next].val);
a[next].l = a[p].l,a[next.r] = a[p].r;
p =next;
}
}
二叉查找树【初模板】
最新推荐文章于 2024-02-22 08:14:45 发布