zoukankan      html  css  js  c++  java
  • 树的遍历(25分)

    L2-006. 树的遍历

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

    输入格式:

    输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

    输出格式:

    在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

    输入样例:
    7
    2 3 1 5 7 6 4
    1 2 3 4 5 6 7
    
    输出样例:
    4 1 6 3 5 7 2
    

     

    #include <cstdio>  
    #include <algorithm>  
    #include <iostream>  
    #include <set> 
    #include<queue>
    #include<cstring>
    #include<string>
    #include<cstdio>
    using namespace std;  
    int ed[55];
    int md[55];
    queue<int>q;
    struct node
    {
        int l,r;
    }tree[55];
    
    int build(int la,int lb,int ra,int rb)
    {
        if(la>lb) return 0;
        int x=ed[rb];
        int p1=la;
        while(md[p1]!=x) p1++;
        int p2=p1-la;
        tree[x].l=build(la,p1-1,ra,ra+p2-1);
        tree[x].r=build(p1+1,lb,ra+p2,rb-1);
        return x;
    }
    
    int a[55];
    int ans=1;
    
    void bfs(int root)
    {
        q.push(root);
        while(!q.empty())
        {
            int v=q.front();q.pop();
            a[ans++]=v;
            if(tree[v].l) q.push (tree[v].l);
            if(tree[v].r) q.push(tree[v].r);
        }
    }
    
    
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>ed[i];
        for(int i=1;i<=n;i++) cin>>md[i];
        build(1,n,1,n);
        bfs(ed[n]);
        for(int i=1;i<=ans-1;i++)
        {
            cout<<a[i];
            if(i!=ans-1) cout<<" ";
        }
        return 0;
    }
  • 相关阅读:
    036 Python进阶小结
    035 异常处理
    033 数据类型分类
    034 Python深浅拷贝
    032 集合类型内置方法
    031 字典类型内置方法
    XML删除节点
    追加XML
    XML文档的读、写
    XML文档的创建
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/8646845.html
Copyright © 2011-2022 走看看