L3-010 是否完全二叉搜索树 (30 分)——测试点6wa分析
思路
二叉搜索树建树+层序遍历,看代码即可。
这里说一说易错点6,小心
n
=
1
n=1
n=1 的情况
AC代码
#include<bits/stdc++.h>
#define ll long long
#define rep(i,x,y) for(int i=x; i<=y; ++i)
#define per(i,x,y) for(int i=x; i>=y; --i)
#define mem(a,b) memset(a,b,sizeof a)
#define pk push_back
#define PLI pair<ll,int>
using namespace std;
const int N = 1e5+9;
int a[N];
int tr[N*4];
void build(int id,int num){
if(!tr[id]) {
tr[id]=num;
return ;
}
if(tr[id]<num) build(id<<1, num);
else build(id<<1|1, num);
}
int main() {
int n;
cin>>n;
rep(i,1,n)
scanf("%d",&a[i]),build(1,a[i]);
bool ok=1;
rep(i,1,n) if(!tr[i]) ok=0;
int t=1;
for(int i=1; t<=n; ++i){
if(tr[i]){
cout<<tr[i];
t++;
if(t<=n) cout<<" ";
}
}
puts("");
if(ok) puts("YES");
else puts("NO");
return 0;
}
朋友WA的代码
因为她初始化ma=-1,当n为1的时候,进不了max函数,初始化ma=1即可
#include<bits/stdc++.h>
using namespace std;
int s[1048580];
int ma=-1;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int x,id=1;
cin>>x;
while(s[id]){
if(s[id]>x){
id=id*2+1;
}else{
id=id*2;
}
}
s[id]=x;
}
queue<int>q;
q.push(1);
while(!q.empty()){
int id=q.front();
q.pop();
if(id!=1){
cout<<" ";
}
cout<<s[id];
if(s[id*2]){
q.push(id*2);
ma=max(ma,id*2);
}
if(s[id*2+1]){
q.push(id*2+1);
ma=max(ma,id*2+1);
}
}
//for(int i=1; i<=n; i++) if(s[i]) ma++;
cout<<endl;
if(ma==n){
cout<<"YES";
}else{
cout<<"NO";
}
return 0;
}