当前位置: 首页 > news >正文

BST(self saved)

#include<iostream>
#include<cstdio>
using namespace std;
int root,tot;
struct bst
{int v,l,r,vnum,lnum;bst(){v=l=r=vnum=lnum=0;}void nw(int a){v=a;vnum=1;lnum=0;l=r=0;}
}tree[1000010];
struct nd
{int v,idx,fa;nd(){v=idx=fa=0;}nd(int a,int b,int c){v=a;idx=b;fa=c;}
};
nd prs(int p,int fa)//前驱 
{if(tree[p].r)return prs(tree[p].r,p);return nd(tree[p].v,p,fa);
}
int suc(int p)//后继 
{if(tree[p].l)return suc(tree[p].l);return tree[p].v;
}
void ist(int p,int tmp)
{if(p==0){p=root=++tot;tree[p].nw(tmp);return ;}if(tmp==tree[p].v)tree[p].vnum++;if(tmp<tree[p].v){tree[p].lnum++;if(!tree[p].l){tree[p].l=++tot;tree[tot].nw(tmp);}elseist(tree[p].l,tmp);}if(tmp>tree[p].v){if(!tree[p].r){tree[p].r=++tot;tree[tot].nw(tmp);}elseist(tree[p].r,tmp);}
}
void ck(int p=1)
{int ls=tree[p].l,rs=tree[p].r;if(ls)ck(ls);cout<<tree[p].v<<" "<<tree[p].vnum<<"\n";if(rs)ck(rs);
}
int ck_lnum(int p,int tmp)
{if(tree[p].v>=tmp&&tree[tree[p].l].v<tmp)return tree[p].lnum;if(tree[p].v>=tmp)return ck_lnum(tree[p].l,tmp);return ck_lnum(tree[p].r,tmp)+1;
}
int dt(int p)//结点p删除 , 返回新结点下标 
{int ls=tree[p].l,rs=tree[p].r;if((!ls)&&(!rs))return 0;if((!ls)||(!rs))return ls|rs;nd ps=prs(tree[p].l,p);if(tree[ps.fa].l==ps.idx)tree[ps.fa].l=0;elsetree[ps.fa].r=0;return ps.idx;
}
void dlt(int p,int tmp)
{int ls=tree[p].l,rs=tree[p].r;if(tree[p].v==tmp)//删到根了 {tree[p].vnum--;if(!tree[p].vnum)root=dt(p);}else if(tmp<tree[p].v){tree[p].lnum--;if(tmp==tree[ls].v)tree[ls].vnum--;if(!tree[ls].vnum)//删除结点 {int tp=dt(ls);tree[tp].l=tree[ls].l;tree[tp].r=tree[ls].r;tree[p].l=tp;}elsedlt(ls,tmp);}else{if(tmp==tree[rs].v)tree[rs].vnum--;if(!tree[rs].vnum)//删除结点 {int tp=dt(rs);tree[tp].l=tree[rs].l;tree[tp].r=tree[rs].r;tree[p].r=tp;}elsedlt(rs,tmp);}ls=tree[p].l;rs=tree[p].r;
}
int get_prs(int p,int tmp)
{if(p==0)return -(int)1e9;if(tree[p].v<tmp)return max(tree[p].v,get_prs(tree[p].r,tmp));elsereturn get_prs(tree[p].l,tmp);
}
int get_suc(int p,int tmp)
{if(p==0)return (int)1e9;if(tree[p].v>tmp)return min(tree[p].v,get_suc(tree[p].l,tmp));elsereturn get_suc(tree[p].r,tmp);
}
int ck_top(int p,int tmp)
{if(tree[p].lnum+1==tmp)return tree[p].v;else if(tree[p].lnum+1>tmp)return ck_top(tree[p].r,tree[p].lnum+1-tmp);elsereturn ck_top(tree[p].l,tmp);
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);//freopen("t.in","r",stdin);int m;cin>>m;while(m--){int op,x;cin>>op>>x;if(op==1)ist(root,x);if(op==2)dlt(root,x);if(op==3)cout<<ck_lnum(root,x)+1<<'\n';if(op==4)cout<<ck_top(root,x)<<'\n';if(op==5)cout<<get_prs(root,x)<<'\n'; if(op==6)cout<<get_suc(root,x)<<'\n';}}
http://www.rkmt.cn/news/14176.html

相关文章:

  • jenkins 用户权限 管理配置
  • Windows系统Web UI自动化测试学习系列4--开源体系平台测试项目环境部署搭建
  • Node生态中最优雅的数据库事务处理机制
  • 详细介绍:扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)
  • 跨网文件交换系统:数字化时代企业与机构的数据安全传输利器
  • 【2025-09-29】团队合作
  • 数据库服务分布架构(MyCAT)
  • 题解:P14038 [PAIO 2025] Adventure Plan
  • 20231414_王仕琪_密码技术密码杂凑算法学习笔记
  • 堆设置了8G,java进程却占用了12G内存
  • IntelliJ IDEA 中 Shared Build Process Heap Size 的重要性与配置
  • 企业数字化转型战略规划:从愿景到落地的完整路径
  • Java 与智慧港口:航运调度与物流枢纽数字化
  • 千亿芯片公司被股东“抛弃” ,AI芯片第一股前景几何?
  • DeepSeek-V3.2-Exp 发布,训练推理提效,API 同步降价
  • 9.29 闲话
  • US$16 Yanhua BMW F/G Chassis Odometer Wiring Harness
  • US$980 Xhorse VVDI2 BMW OBD + CAS4 +FEM/BDC Functions Full BMW License
  • 2025年9月29日
  • 最高人民法院新劳动争议司法解释一 理解与适用
  • 逆元 组合数问题
  • 一、驱动基础知识速览(迅为RK3568)
  • MonoDETR(2)
  • 记录---window.close()失效 + Chrome浏览器调试线上代码
  • 启发式合并 [USACO22DEC] Making Friends P
  • 加密的病例单
  • 【多线程】什么是原子操作(Atomic Operation)? - 详解
  • 复刻江协旋钮控制模块
  • c语言switch和if语句
  • Qt(制作一个方便的文本编辑器)