【PAT甲级】1086 Tree Traversals Again (25 分)(树知二求一)

题意:
输入一个正整数N(<=30),接着输入2*N行表示栈的出入(入栈顺序表示了二叉搜索树的先序序列,出栈顺序表示了二叉搜索树的中序序列),输出后序序列。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 stack<int>st;
 5 int a[37],b[37];
 6 int ans[37];
 7 void build(int n,int*a,int*b,int*ans){
 8     if(!n)
 9         return ;
10     int x=find(b,b+n,a[0])-b;
11     build(x,a+1,b,ans);
12     build(n-x-1,a+x+1,b+x+1,ans+x);
13     ans[n-1]=a[0];
14 }
15 int main(){
16     ios::sync_with_stdio(false);
17     cin.tie(NULL);
18     cout.tie(NULL);
19     int n;
20     cin>>n;
21     int cnt1=0,cnt2=0;
22     for(int i=1;i<=n+n;++i){
23         string s;
24         cin>>s;
25         int x;
26         if(s[1]=='u')
27             cin>>x;
28         if(s[1]=='u'){
29             a[cnt1++]=x;
30             st.push(x);
31         }
32         else{
33             b[cnt2++]=st.top();
34             st.pop();
35         }
36     }
37     build(n,a,b,ans);
38     for(int i=0;i<n;++i){
39         cout<<ans[i];
40         if(i<n-1)
41             cout<<" ";
42     }
43     return 0;
44 }

 

 

 

posted @ 2019-11-18 01:43  sewage  阅读(169)  评论(0编辑  收藏  举报