天梯赛自主练习2补题 (21年模拟赛)

题目
感觉有点摆了,前边的题都有做不明白的。
最后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;
}

题意:
思路:
时间复杂度:
代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值