版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}