#include<bits/stdc++.h>
using namespace std;
const int N=2000010;
int n;
int x[N];
int tr[N];
bool is_tree=true;
vector<int> ans;
int root=0;
void dfs1(vector<int> l,vector<int> r,int roots)
{
//cout<<roots<<" ";
if(l.size()==0&&r.size()==0){
//cout<<roots<<" ";
ans.push_back(roots);
return ;
}
if(l.size()&&l[0]>=roots) is_tree=false;
if(r.size()&&r[0]<roots) is_tree=false;
vector<int> l1;vector<int> r1;
vector<int> l2;vector<int> r2;
int ql=l.size();int qr=r.size();
int d=ql;
for(int i=1;i<ql;i++){
if(l[i]<l[0]) l1.push_back(l[i]);
else{
d=i;
break;
}
}for(int i=d;i<ql;i++){
r1.push_back(l[i]);
if(l[i]<l[0]) is_tree=false;
}
d=qr;
for(int i=1;i<qr;i++){
if(r[i]<r[0]) l2.push_back(r[i]);
else{
d=i;
break;
}
}for(int i=d;i<qr;i++){
r2.push_back(r[i]);
if(r[i]<r[0]) is_tree=false;
}
if(l.size()) dfs1(l1,r1,l[0]);
if(r.size()) dfs1(l2,r2,r[0]);
ans.push_back(roots);
//cout<<roots<<" ";
}
void dfs2(vector<int> l,vector<int> r,int roots)
{
//cout<<roots<<" ";
if(l.size()==0&&r.size()==0){
//cout<<roots<<" ";
ans.push_back(roots);
return ;
}
if(l.size()&&l[0]<roots) is_tree=false;
if(r.size()&&r[0]>=roots) is_tree=false;
vector<int> l1;vector<int> r1;
vector<int> l2;vector<int> r2;
int ql=l.size();int qr=r.size();
int d=ql;
for(int i=1;i<ql;i++){
if(l[i]>=l[0]) l1.push_back(l[i]);
else{
d=i;
break;
}
}for(int i=d;i<ql;i++){
r1.push_back(l[i]);
if(l[i]>=l[0]) is_tree=false;
}
d=qr;
for(int i=1;i<qr;i++){
if(r[i]>=r[0]) l2.push_back(r[i]);
else{
d=i;
break;
}
}for(int i=d;i<qr;i++){
r2.push_back(r[i]);
if(r[i]>=r[0]) is_tree=false;
}
if(l.size()) dfs2(l1,r1,l[0]);
if(r.size()) dfs2(l2,r2,r[0]);
ans.push_back(roots);
//cout<<roots<<" ";
}
int main()
{
vector<int> l;
vector<int> r;
cin>>n;
for(int i=1;i<=n;i++) cin>>x[i];
root=x[1];
int d=n+1;
if(root>x[2])
{
for(int i=2;i<=n;i++){
if(x[i]<x[1]) l.push_back(x[i]);
else{
d=i;
break;
}
}for(int i=d;i<=n;i++){
r.push_back(x[i]);
if(x[i]<x[1]) is_tree=false;
}
dfs1(l,r,root);
}
else{
for(int i=2;i<=n;i++){
if(x[i]>=x[1]) l.push_back(x[i]);
else{
d=i;
break;
}
}for(int i=d;i<=n;i++){
if(x[i]>=x[1]) is_tree=false;
r.push_back(x[i]);
}
dfs2(l,r,root);
}
if(!is_tree){
cout<<"NO";
return 0;
}else{
cout<<"YES"<<endl;
for(int i=0;i<ans.size();i++){
if(i<ans.size()-1) cout<<ans[i]<<" ";
else cout<<ans[i];
}
}
}
7-11 这是二叉搜索树吗?
最新推荐文章于 2024-05-21 23:16:53 发布