题目
感觉有点摆了,前边的题都有做不明白的。
最后L3三个题不是正常孩子做的啊,都是1-2个通过的,打暴力都没法打,模拟赛这么恐怖吗?拿不了国二咧,学不明白。
L2-3 这是二叉搜索树吗?
题意: 给定一个二叉树的前序遍历,判定是否为BST或者BST的镜像遍历。(>=的数放在右子树,而且可能有相同的数)如果是,输出对应的后序遍历,否则,输出NO。
球球了,别给出二叉树的题,孩子真不会。
思路: 如果没有相同的数,我觉得可以建树,但是有相同的数,不会咧。
做法是由BST的性质,树根肯定是a[l],找到第一个>=a[l]的位置x,既是右子树的开始、-1是左子树的结尾。同理,在x及其右侧找到第一个<a[l]的位置y,-1是右子树的结尾。(因为有不合法的,所以要在x及其右侧找,什么鬼题,很烦)
时间复杂度: O(n)
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+10;
int n,m,k,T;
int a[N];
vector<int> va;
bool flag = 0;
void fun(int l,int r,bool op)
{
if(l > r) return ;
int x,y;
if(!op)
{
for(x=l+1;a[x]<a[l]&&x<=r;++x); //第一个>=树根,-1是左子树结尾
for(y=x;a[y]>=a[l]&&y<=r;++y); //第一个<树根,-1是右子树结尾
}
else
{
for(x=l+1;a[x]>=a[l]&&x<=r;++x); //第一个<树根,-1是左子树结尾
for(y=x;a[y]<a[l]&&y<=r;++y); //第一个>=树根,-1是右子树结尾
}
fun(l+1,x-1,op); //左子树
fun(x,y-1,op);
va.push_back(a[l]);
}
void check()
{
if(va.size() == n)
{
flag = 1;
cout<<"YES\n";
for(int i=0;i<va.size();++i)
{
if(i) cout<<" ";
cout<<va[i];
}
}
}
void solve()
{
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
fun(1,n,false);
check();
if(flag) return ;
va.clear();
fun(1,n,true);
check();
if(flag) return ;
cout<<"NO";
}
signed main(void)
{
solve();
return 0;
}
题意:
思路:
时间复杂度:
代码: