思路分析:
这道题主要是根据前序遍历,确定左子树和右子树的范围,然后判断差值如果为1的话,就继续递归。并且每次都要把在递归之后才把当前树的根节点放入到答案数组中。因为这样就是后序遍历。并且这里要分非镜像的和镜像,如果其中一个答案不正确,就做另外一个,如果两个都不正确就直接输出NO,反之输出答案数组。
代码实现:
#includeusing namespace std; int n; int qian[10010]; int flag=0; vector a; void find1(int left, int right) { if(left>right)return; int begin=left+1; int end=right; while (begin <= right && qian[begin] < qian[left]) begin++; while (end > left && qian[end] >= qian[left]) end--; if(begin-end!=1) return; find1(left+1,end); find1(begin,right); a.push_back(qian[left]); } void find(int left, int right) { if(left>right)return; int begin=left+1; int end=right; while (begin <= right && qian[begin] >= qian[left]) begin++; while (end > left && qian[end] < qian[left]) end--; if(begin-end!=1) return; find(left+1,end); find(begin,right); a.push_back(qian[left]); } int main() { cin>>n; for(int i=0;i >qian[i]; find1(0,n-1); if(a.size()!=n) { a.clear(); find(0,n-1); } if(a.size()!=n) cout<<"NO"; else { cout<<"YES"< ::iterator i=a.begin();i!=a.end();i++) { if(i!=a.end()-1) cout<<*i<<" "; else cout<<*i; } } }



