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

 

posted @ 2019-10-29 22:04  月光下の魔术师  阅读(4)  评论(0)    收藏  举报