题目:
思路分析:
二叉搜索树的前序遍历分为三部分 就是第一个数是树根 第二部分都是小于第一个数的部分
第三部分是大于第一个数的部分 按照这样的思路我们递归就可以把树展开 然后按照后序遍
历的特征递归输出
代码实现:
const int MAX=1010;
int a[MAX];
int f=0;
int n;
vector<int>ans;
void dfs(int head,int tail){
if(head>tail) return;
int now=a[head];
int i=head+1;
int j=tail;
if(!f){
while (i<=tail&&a[i]<now) {
i++;
}
while (j>head&&a[j]>=now) {
j--;
}
}
else {
while (i<=tail&&a[i]>=now) {
i++;
}
while (j>head&&a[j]<now) {
j--;
}
}
if(i-j!=1) return;
dfs(head+1,j);
dfs(i,tail);
ans.push_back(now);
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
dfs(0,n-1);
if(ans.size()!=n){
ans.clear();
f=1;
dfs(0,n-1);
}
if(ans.size()!=n){
cout<<"NO"<<endl;
}
else {
cout<<"YES"<<endl;
f=0;
for(auto i:ans){
if(f++!=0)cout<<" ";
cout<<i;
}
}
}