pat 1043

题目链接: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 }

 

posted @ 2013-11-01 17:05  coding_monkey  阅读(254)  评论(0编辑  收藏  举报