社区讨论
求助!WA*3
P5076【深基16.例7】普通二叉树(简化版)参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m42reuvp
- 此快照首次捕获于
- 2024/11/29 21:08 去年
- 此快照最后确认于
- 2025/11/04 13:39 4 个月前
CPP
#include<iostream>
#include<map>
using namespace std;
struct tree{
int value,lt,rt,si;
};
tree inTree[10000+1];
int tot=0;
map<int,bool> dp;
void insert(int x,int pos){
inTree[pos].si++;
if(tot==0){
inTree[++tot].value=x;
return;
}
if(x<inTree[pos].value){
if(!inTree[pos].lt){
inTree[pos].lt=++tot;
inTree[tot].value=x;
inTree[tot].si=1;
return;
}else{
insert(x,inTree[pos].lt);
}
}else{
if(!inTree[pos].rt){
inTree[pos].rt=++tot;
inTree[tot].value=x;
inTree[tot].si=1;
return;
}else{
insert(x,inTree[pos].rt);
}
}
}
int findRank(int x,int pos){
if(pos==0) return 0;
if(x==inTree[pos].value){
return inTree[inTree[pos].lt].si;
}else if(x<inTree[pos].value){
return findRank(x,inTree[pos].lt);
}else{
return inTree[inTree[pos].lt].si+1+findRank(x,inTree[pos].rt);
}
}
int findNumber(int x,int pos){
if(pos==0) return 0;
if(inTree[inTree[pos].lt].si+1==x){
return inTree[pos].value;
}else if(inTree[inTree[pos].lt].si+1>x){
return findNumber(x,inTree[pos].lt);
}else{
return findNumber(x-inTree[inTree[pos].lt].si-1,inTree[pos].rt);
}
}
int main(){
int q;
cin>>q;
for(int i=1;i<=q;i++){
int op,x;
cin>>op>>x;
int t;
switch(op){
case 1:
cout<<findRank(x,1)+1<<endl;
break;
case 2:
cout<<findNumber(x,1)<<endl;
break;
case 3:
t=findRank(x,1);
t=findNumber(t,1);
if(t) cout<<t<<endl;
else cout<<-2147483647<<endl;
break;
case 4:
if(dp[x]) t=findRank(x,1)+2;
else t=findRank(x,1)+1;
t=findNumber(t,1);
if(t) cout<<t<<endl;
else cout<<2147483647<<endl;
break;
case 5:
dp[x]=1;
insert(x,1);
break;
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...