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;
}

posted @ 2022-08-28 08:43  翔村亲亲鸟  阅读(22)  评论(0编辑  收藏  举报