码迷,mamicode.com
首页 > 其他好文 > 详细

树的遍历

时间:2020-02-19 23:53:08      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:show   span   back   img   oid   mat   eve   hide   html   

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

输入格式:

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

输出格式:

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

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
 

输出样例:

4 1 6 3 5 7 2



技术图片
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n,mid[maxn],beh[maxn];

struct node{
    int l,r;
}tree[maxn];

int build(int la,int ra,int lb,int rb){//分别表示中序和后序
    if(la > ra) return 0;
    int root = beh[rb];
    int p = la;
    while(mid[p] != root)
        p++;
    int t = p - la;
    tree[root].l = build(la,p - 1,lb,lb + t - 1);
    tree[root].r = build(p + 1,ra,lb + t,rb - 1);
    return root;
}
vector<int> ve;
queue<int> que;
void bfs(int x){
    que.push(x);
    while(!que.empty()){
        int tp = que.front();
        que.pop();
        ve.push_back(tp);
        if(tree[tp].l)
            que.push(tree[tp].l);
        if(tree[tp].r)
            que.push(tree[tp].r);
    }
}
int main(){
    //freopen("in","r",stdin);
    ios::sync_with_stdio(0);
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> beh[i];
    for(int i = 1; i <= n; i++) cin >> mid[i];
    build(1,n,1,n);
    bfs(beh[n]);
    for(int i = 0; i < ve.size(); i++){
        if(i) cout << " " << ve[i];
        else cout << ve[i];
    }
    return 0;
}
View Code

 

树的遍历

标签:show   span   back   img   oid   mat   eve   hide   html   

原文地址:https://www.cnblogs.com/xcfxcf/p/12333734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!