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;
}
原文地址:https://www.cnblogs.com/littlepear/p/5681450.html