1. 程式人生 > >pat 甲級 1086(樹的遍歷||建樹)

pat 甲級 1086(樹的遍歷||建樹)

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(
"%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; }
View Code

思路2:轉換為前序中序遍歷(參考柳神的博客)

如果輸入時不帶堆棧就是前序遍歷,帶堆棧就是中序遍歷,最後轉換為後序遍歷。

技術分享圖片
#include<iostream>
#include<vector>
#include<cstdio>
#include<stack>
#include<cstring>
using
namespace 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; }
View Code

pat 甲級 1086(樹的遍歷||建樹)