PTA 1043 Is It a Binary Search Tree (25 分)
题意:判断所给的前序是否构成BST或者Mirror Image of a BST.
题解:
-
如果是BST,那么直接根据前序和中序找到后序。中序为升序排列。
-
如果镜像BST,那么中序为降序排列。
-
注意在solve函数中如果是直接找BST树,那么第一个找的的就是此结点。如果镜像,那么最后一个才是。
#include <bits/stdc++.h>
using namespace std;
int const N = 1000 + 10;
int n,pre[N],in[N],pos,flag;
int ff;
vector<int>ans;
void solve(int l,int r){
if(!flag) return;
if(l > r) return;
int mid = 0;
for(int i=l;i<=r;i++){
if(in[i] == pre[pos]){
if(ff){
mid = i;
break;
}else{
mid = i;
}
}
}
pos++;
if(mid == 0){
flag = false;
return;
}
solve(l,mid - 1);
solve(mid + 1,r);
ans.push_back(in[mid]);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&pre[i]);
in[i] = pre[i];
}
sort(in + 1,in + 1 + n);
flag = pos = 1;
ff = 1;
solve(1,n);
if(flag){
printf("YES\n");
for(int i=0;i<ans.size();i++){
printf("%d%c",ans[i],i == ans.size() - 1 ? '\n' : ' ');
}
}else{
ans.clear();
sort(in + 1,in + 1 + n,greater<int>());
flag = pos = 1;
ff = 0;
solve(1,n);
if(flag){
printf("YES\n");
for(int i=0;i<ans.size();i++){
printf("%d%c",ans[i],i == ans.size() - 1 ? '\n' : ' ');
}
}
}
if(!flag) printf("NO\n");
return 0;
}

浙公网安备 33010602011771号