PAT (Advanced Level) 1043 Is It a Binary Search Tree (BST先序求后序)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w419387229/article/details/82082504

发现个很巧妙的做法:

原博:https://www.liuchuo.net/archives/2153 

利用了先序和后序的关系来直接建立后序,先假设每个都是BST,如果建立完之后,post的长度不是n,就表明,其中有些点肯定被忽略了,这就说明这不是BST;再假设是MirrorBST,同理如果还不是,则两种都不是了。

PostTraversal函数中的left和right,分别表示左右子树的边界,但这里有个点要注意,如果是某种树的话,left一定会比right大1,这个自己摆弄下就能明白了

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
int n;
int BST = 1;
vector<int> pre;
vector<int> post;
void PostTraversal(int root, int broad){
	if(root > broad) return;
	int left = root + 1, right = broad;
	if(BST){
		while(left <= broad && pre[root] > pre[left]) ++left;
		while(right > root && pre[root] <= pre[right]) --right;
	}
	else{
		while(left <= broad && pre[root] <= pre[left]) ++left;
		while(right > root && pre[root] > pre[right]) --right;
	}
	if(left - right > 1) return;
	PostTraversal(root + 1, right);
	PostTraversal(left, broad);
	post.push_back(pre[root]);
}
int main(){
	scanf("%d",&n);
	pre.resize(n);
	for(int i = 0; i < n; ++i){
		scanf("%d",&pre[i]);
	}
	PostTraversal(0,n-1);
	if(post.size() != n){
		BST = 0;
		post.clear();
		PostTraversal(0,n-1);
	}
	if(post.size() == n){
		cout << "YES" << endl << post[0];
		for(int i = 1; i < n; ++i){
			printf(" %d",post[i]);
		}
	}
	else{
		cout << "NO" << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/w419387229/article/details/82082504