题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1043
思想:给一个先序遍历, 对于二叉搜索树来说,中序遍历已知,题目中说的mirror 其实就是按照左大右小的顺序,所以对于题目给定的先序遍历, 先判断前2项,若第一项小于第二项,那可能是二叉搜索树(也可能是NO),这时候中序就升序排列,第一项大于等于第二项,可能是mirror,中序就降序排列。然后控制好下标,递归地后序遍历即可(中间判断这个序列是不是NO)。
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 using namespace std; 5 6 vector<int> preorder; 7 vector<int> inorder; 8 vector<int> postorder; 9 10 void nm_postorder(int pi, int pj, int ii, int ij) 11 { 12 if(pi > pj || ii > ij) 13 return; 14 int pos; 15 for(int i = ii; i <= ij; ++i) 16 if(inorder[i] == preorder[pi]){ 17 pos = i; break; 18 } 19 for(int i=1; i<=pos-ii; ++i) 20 if(preorder[pi+i] >= preorder[pi]){ 21 return; 22 } 23 for(int i=pi+pos-ii+1; i<= pj; ++i) 24 if(preorder[i] < preorder[pi]){ 25 return; 26 } 27 nm_postorder(pi+1, pi+pos-ii, ii, pos-1); 28 nm_postorder(pi+pos-ii+1, pj, pos+1, ij); 29 postorder.push_back(preorder[pi]); 30 } 31 32 void m_postorder(int pi, int pj, int ii, int ij) 33 { 34 if(pi > pj || ii > ij) 35 return; 36 int pos; 37 for(int i = ij; i >= ii; --i) 38 if(inorder[i] == preorder[pi]){ 39 pos = i; break; 40 } 41 for(int i=1; i<=pos-ii; ++i) 42 if(preorder[pi+i] < preorder[pi]){ 43 return; 44 } 45 for(int i=pi+pos-ii+1; i<= pj; ++i) 46 if(preorder[i] >= preorder[pi]){ 47 return; 48 } 49 m_postorder(pi+1, pi+pos-ii, ii, pos-1); 50 m_postorder(pi+pos-ii+1, pj, pos+1, ij); 51 postorder.push_back(preorder[pi]); 52 } 53 54 bool comp(int n1, int n2){ 55 if(n1 > n2) 56 return true; 57 else 58 return false; 59 } 60 61 int main() 62 { 63 int N; cin>>N; 64 preorder.resize(N); 65 inorder.resize(N); 66 for(int i=0; i != N; ++i){ 67 cin>>preorder[i]; 68 inorder[i] = preorder[i]; 69 } 70 if(preorder.size() == 1){ 71 cout<<"YES"<<endl<<preorder[0]<<endl; 72 return 0; 73 } 74 else if(preorder[0] > preorder[1]){ 75 sort(inorder.begin(), inorder.end()); 76 nm_postorder(0, N-1, 0,N-1); 77 } 78 else{ 79 sort(inorder.begin(), inorder.end(), comp); 80 m_postorder(0, N-1, 0, N-1); 81 } 82 if(postorder.size() != N) 83 cout<<"NO"<<endl; 84 else{ 85 cout<<"YES"<<endl; 86 for(int i=0; i<N; ++i) 87 if( i == N-1) 88 cout<<postorder[i]<<endl; 89 else 90 cout<<postorder[i]<<" "; 91 } 92 return 0; 93 }