zoukankan      html  css  js  c++  java
  • L2-006. 树的遍历

    题目链接:L2-006. 树的遍历

    今天一神给我手敲二叉树模板,瞬间就领悟了,感觉自己萌萌哒!

    看上去很直观!

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <queue>
    using namespace std;
    const int maxn = 1e3+5;
    int a[maxn];
    int b[maxn];
    int floor[maxn];
    int tr[maxn<<2];
    void build(int x,int al,int ar,int bl,int br) //和线段树差不多
    {
        if(ar<al||br<bl) return;
        if(al==ar)
        {
            tr[x] = a[al];
            return;
        }
        for(int i = al; i<=ar; i++)
        {
            if(a[i]==b[br])
            {
                tr[x] = b[br];
                build(2 * x , al , i - 1 , bl , bl + i - 1 - al); //左子树的左端点,右端点,在a数组和b数组。
                build(2 * x + 1 , i + 1, ar ,  bl + i - al, br - 1); //右子树的左端点,右端点,在a数组和b数组。
                break;
            }
        }
    }
    /*void dfs(int x) //按先序遍历
    {
        if(!tr[x]) return;
        printf("%d ",tr[x]);
        dfs(2*x);
        dfs(2*x+1);
    }*/
    void bfs(int x)  //按层序遍历
    {
        queue<int> q;
        q.push(x);
        int ans = 1;
        while(!q.empty())
        {
            int y = q.front();
            q.pop();
            if(tr[y]==0) continue;
            floor[ans++] = tr[y];
            q.push(2*y);
            q.push(2*y+1);
        }
    }
    int main()
    {
        int n;
        memset(tr,0,sizeof(tr));
        scanf("%d",&n);
        for(int i = 1; i<=n; i++)
        {
            scanf("%d",&b[i]);
        }
        for(int i = 1; i<=n; i++)
        {
            scanf("%d",&a[i]);
        }
        build(1,1,n,1,n);
        //dfs(1);
        bfs(1);
        for(int i = 1; i<n; i++) printf("%d ",floor[i]);
        printf("%d
    ",floor[n]);
        return 0;
    }

     只求先序时,不用遍历。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <queue>
    using namespace std;
    const int maxn = 1e3+5;
    int a[maxn];
    int b[maxn];
    vector<int> g;
    void build(int x,int al,int ar,int bl,int br)
    {
        if(ar<al||br<bl) return;
        if(al==ar)
        {
            g.push_back(a[al]);
            return;
        }
        for(int i = al; i<=ar; i++)
        {
            if(a[i]==b[br])
            {
                g.push_back(a[i]);
                build(2 * x , al , i - 1 , bl , bl + i - 1 - al);
                build(2 * x + 1 , i + 1, ar ,  bl + i - al, br - 1);
                break;
            }
        }
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i = 1; i<=n; i++)
        {
            scanf("%d",&b[i]);
        }
        for(int i = 1; i<=n; i++)
        {
            scanf("%d",&a[i]);
        }
        build(1,1,n,1,n);
        for(int i = 0; i<g.size()-1; i++) printf("%d ",g[i]);
        printf("%d
    ",g[g.size()-1]);
        return 0;
    }
  • 相关阅读:
    Servlet
    Web服务器和Tomcat
    DOM文档对象模型
    JavaScript总结
    CSS总结
    商城——购物车模块
    用户注册登录认证模块
    P2P技术之STUN、TURN、ICE详解
    P2P中的NAT穿越(打洞)方案详解
    NAT技术详解
  • 原文地址:https://www.cnblogs.com/littlepear/p/5681450.html
Copyright © 2011-2022 走看看