PAT甲级1043

题面


二叉搜索树: 左子树小于根 , 右子树大于等于根.

镜像二叉搜索树: 左子树大于等于根 , 右子树小于根.

给出一棵树的前序遍历 , 判断其是不是二叉搜索树或者是镜像二叉搜索树.

其实有很明显的子结构特征 , 想到用递归 , 重要的是找到左右子树的范围 , 看看代码就能明白了 , 觉得BST很经典就码了这篇.

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n,c,flag,a[1001];
vector<int> Q;
void check(int root,int tail){
	if(root > tail) return;
	int i = root+1,j = tail;
	if(!flag){
		while(i<=tail&&a[i]<a[root]) ++i;
		while(j>root&&a[j]>=a[root]) --j;
	}
	else{
		while(i<=tail&&a[i]>=a[root]) ++i;
		while(j>root&&a[j]<a[root]) --j;
	}
	if(i-j!=1) return;
	check(root+1,j);
	check(i,tail);
	Q.push_back(a[root]);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
		scanf("%d",&a[i]);
	check(1,n);
	if(Q.size()!=n){
		flag = 1;Q.clear();
		check(1,n);
	}
	else c = 1;
	if(Q.size()==n) c=1;
	if(c==1){
		cout<<"YES"<<endl;
		for(int i=0;i<Q.size();++i){
			cout<<Q[i];
			if(i != Q.size()-1) cout<<" ";
		}
	}
	else cout<<"NO";
	return 0;
}
posted @ 2021-10-09 16:18  xqy2003  阅读(33)  评论(0)    收藏  举报