zoukankan      html  css  js  c++  java
  • PAT (Advanced Level) 1086. Tree Traversals Again (25)

    入栈顺序为先序遍历,出栈顺序为中序遍历。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<stack>
    using namespace std;
    
    const int maxn=1000+10;
    const int INF=0x7FFFFFFF;
    int n,tot;
    int Preorder[maxn],Inorder[maxn],Postorder[maxn];
    int APreorder[maxn],AInorder[maxn];
    int ans[maxn];
    struct Binary_Tree
    {
        int left;
        int right;
        int date;
    } node[maxn];
    int p1,p2;
    stack<int>s;
    
    void Build_Binary_Tree(int L,int R,int father)
    {
        int i,MIN=INF,MAX=-INF;
        for(i=L; i<=R; i++)
        {
            if(APreorder[Inorder[i]]>MAX) MAX=APreorder[Inorder[i]];
            if(APreorder[Inorder[i]]<MIN) MIN=APreorder[Inorder[i]];
        }
        node[tot].date=Preorder[MIN];
        if(father<0) node[-father].right=tot;
        if(father>0) node[father].left=tot;
        int now=tot;
        tot++;
        if(AInorder[Preorder[MIN]]-1-L>=0)
            Build_Binary_Tree(L,AInorder[Preorder[MIN]]-1,now);
        if(R-(AInorder[Preorder[MIN]]+1)>=0)
            Build_Binary_Tree(AInorder[Preorder[MIN]]+1,R,-now);
    }
    
    void dfs(int p)
    {
        if(node[p].left!=-1) dfs(node[p].left);
        if(node[p].right!=-1) dfs(node[p].right);
        ans[tot]=node[p].date;
        tot++;
    }
    
    int main()
    {
        while(~scanf("%d",&n))
        {
            int i;
            tot=1;
            for(i=0; i<=n; i++)
            {
                node[i].left=-1;
                node[i].right=-1;
                node[i].date=-1;
            }
    
            p1=p2=1;
            for(int i=1;i<=2*n;i++)
            {
                char op[10]; scanf("%s",op);
                if(op[1]=='u')
                {
                    int num; scanf("%d",&num);
                    s.push(num);
                    Preorder[p1++]=num;
                }
                else if(op[1]=='o')
                {
                    int top=s.top(); s.pop();
                    Inorder[p2++]=top;
                }
            }
    
            for(i=1; i<=n; i++)  APreorder[Preorder[i]]=i;
            for(i=1; i<=n; i++ )AInorder[Inorder[i]]=i;
            
            Build_Binary_Tree(1,n,0);
           
            tot=0;
            dfs(1);
            for(i=0; i<n; i++)
            {
                if(i<n-1) printf("%d ",ans[i]);
                else printf("%d
    ",ans[i]);
            }
        }
        return 0;
    }
  • 相关阅读:
    查询论文引用次数及格式和相似论文的方法
    JAVA日期加减运算
    luogu2833 等式
    luogu2261 [CQOI2007] 余数之和
    luogu2822 组合数问题
    luogu3942 将军令 贪心
    luogu3941 入阵曲
    luogu3939 数颜色
    二分查找总结
    luogu3938 斐波那契
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5636953.html
Copyright © 2011-2022 走看看