关于树的题目
要在之后进行一下系统的学习
这个题题意不难,,方法其实,,看了之后很好理解
学习学习
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
queue<int> q;
int arr[1100], n;
int flag = 1;
void dfs(int l, int r, int flag1){
int k = r+1; //不可随意更改
if(l > r || !flag ) return ;
for(int i=l+1; i<r+1; i++ ){
if(arr[i]<arr[l]&&!flag1) continue;
if(arr[i]>=arr[l]&&flag1) continue;
k = i;
break;
}
for(int i=k; i<r+1; i++){
if(arr[i]<arr[l]&&!flag1) flag = 0; //非镜像右边都比根大
if(arr[i]>=arr[l]&&flag1) flag = 0; //镜像右边都比根小
}
if(!flag) return ; //出现不符合规律的
dfs(l+1,k-1,flag1); //左子树
dfs(k,r,flag1); //右子树
q.push(arr[l]); //要输出后序,所以最后存根
}
int main(){
scanf("%d",&n);
for(int i=1; i<=n; i++){
scanf("%d",&arr[i]);
}
int flag1;
if(arr[1] > arr[2]) flag1 = 0; //非镜像
else flag1 = 1; //镜像
dfs(1,n,flag1);
if(flag == 0) {
printf("NO");
return 0;
}
printf("YES\n");
for(int i=0; i<n; i++){
if(i == 0){
printf("%d",q.front());
q.pop();
}
else {
printf(" %d",q.front());
q.pop();
}
}
return 0;
}