题目意思
给你一个整数n,接着给你n个整数 ,现在让你判断所给的数是否是一棵二叉搜索树的前序序列或者是其镜像。
解题思路
根据二叉搜索树的性质,肯定能用根将二叉树分为左右两个部分,否则就不是标准的前序序列。
镜像二叉树其实就是左小右大倒过来判断。
代码部分
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=1100;
bool vis;
int pre[maxn];
vector <int> be;
void f(int left,int right)
{
if(left>right)
return;
int tl=left+1;
int tr=right;
if(!vis)
{
while(tl<=right&&pre[tl]<pre[left])
tl++;
while(tr>left&&pre[tr]>=pre[left])
tr--;
}
else
{
while(tl<=right&&pre[tl]>=pre[left])
tl++;
while(tr>left&&pre[tr]<pre[left])
tr--;
}
if(tl-tr!=1)
return;
f(left+1,tr);
f(tl,right);
be.push_back(pre[left]);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0; i<n; ++i)
{
scanf("%d",&pre[i]);
}
f(0,n-1);
if(be.size()!=n)
{
vis=1;
be.clear();
f(0,n-1);
}
if(be.size()!=n)
{
printf("NO\n");
}
else
{
printf("YES\n%d",be[0]);
for(int i=1; i<n; ++i)
printf(" %d",be[i]);
printf("\n");
}
}
return 0;
}