pat 甲級 1086(樹的遍歷||建樹)
阿新 • • 發佈:2018-12-07
pri con pac etc namespace pla back 中序 ace
思路1:可以用建樹來做
由於是先序遍歷,所以直接先序建樹就行了。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 12000; int a[maxn],n,num; char str[20]; void build(int id) { int x; if(num<=0) return ; scanf("%s",str); if(str[1]==‘u‘) { scanf(View Code"%d",&x); a[id]=x; num--; build(id*2); build(id*2+1); } else num--; } void postorder(int x) { if(a[x]!=0) { postorder(x*2); postorder(x*2+1); if(num==0) printf("%d",a[x]),num=1; else printf(" %d",a[x]); } } int main(void) { int i; cin>>n; getchar(); num=n*2; build(1); num=0; postorder(1); return 0; }
思路2:轉換為前序中序遍歷(參考柳神的博客)
如果輸入時不帶堆棧就是前序遍歷,帶堆棧就是中序遍歷,最後轉換為後序遍歷。
#include<iostream> #include<vector> #include<cstdio> #include<stack> #include<cstring> usingView Codenamespace std; const int maxn = 12000; vector <int> in,pre,num; char str[20]; int n,pt=0; void f(int root,int st,int ed) { if(st>ed) return ; int i; for(i=st;i<=ed;i++) if(pre[root]==in[i]) break; f(root+1,st,i-1); f(root+(i-st)+1,i+1,ed); if(pt==0) printf("%d",num[pre[root]]),pt=1; else printf(" %d",num[pre[root]]); } int main(void) { int i,x,id=0; stack <int> st; cin>>n; for(i=0;i<n*2;i++) { scanf("%s",str); if(str[1]==‘u‘) { scanf("%d",&x); num.push_back(x); pre.push_back(id); st.push(id++); } else { in.push_back(st.top()); st.pop(); } } f(0,0,n-1); return 0; }
pat 甲級 1086(樹的遍歷||建樹)