团体程序设计天梯赛 L3-010 是否完全二叉搜索树 (30分)

题目链接:

L3-010 是否完全二叉搜索树 (30分)

思路:

可以模仿线段树建树的方式,用数组建树,然后遍历

代码:

#include<bits/stdc++.h>

using namespace std;

#define l (u << 1)
#define r (u << 1 | 1)
int n, tree[(1 << 20) + 5];
inline void push(int & x, int u) {
	if(tree[u] == 0) { tree[u] = x; return; }
	if(x > tree[u]) push(x, l);
	else push(x, r);
}
void bfs() {
	queue<int> que;
	que.push(1);
	while(!que.empty()) {
		int u = que.front();
		que.pop();
		if(u != 1) cout << ' ';
		cout << tree[u];		
		if(tree[l]) que.push(l);
		if(tree[r]) que.push(r);	
	}
	cout << '\n';
}

int main() {
#ifdef MyTest
	freopen("Sakura.txt", "r", stdin);
#endif
	cin >> n;
	for(int i = 0; i < n; i++) { int x; cin >> x; push(x, 1); };
	bfs();
	for(int i = 1; i <= n; i++) if(!tree[i]) { puts("NO"); exit(0); }
	puts("YES");
	return 0;
}
posted @ 2020-01-29 20:22  YuhanのBlog  阅读(117)  评论(0编辑  收藏  举报