L2-004 这是二叉搜索树吗?

#include <bits/stdc++.h>
using namespace std;
#define int long long
using pii=pair<int,int>;
int a[1005];
vector<int>ans;
bool im=0;
void dfs(int l,int r)
{
if(l>r) return;
int i=l+1,j=r;
if(!im){
while(i<=r&&a[i]<a[l]) i++;
while(j>l&&a[j]>=a[l]) j--;
}else{
//镜像左子树的值大于根节点,右子树的值小于根节点
while(i<=r&&a[i]>=a[l]) i++;
while(j>l&&a[j]<a[l]) j--;
}
//j会停在最后一个小于根结点的值 i会停在最后一个大于等于根节点的值 也就是左右子树的根结点
if(i-j!=1) return ;
dfs(l+1,j);//左子树
dfs(i,r);//右子树
ans.push_back(a[l]);//dfs一定是先放最后一层子树的左孩子,所以这么放下来,就是对应的后序遍历
}
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
dfs(1,n);
//for(auto i:ans) cout<<i <<" ";
if(ans.size()!=n){
im=1;
ans.clear();
dfs(1,n);
}
if(ans.size()==n)
{
cout<<"YES\n";
cout<<ans[0];
for(int i=1;i<n;i++)
{
cout<<" "<<ans[i];
}
return;
}
cout<<"NO";
}
signed main()
{
int t=1;
// cin>>t;
while(t--) solve();
}
posted on 2025-03-30 15:39 swj2529411658 阅读(26) 评论(0) 收藏 举报
浙公网安备 33010602011771号