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

浙公网安备 33010602011771号