树的遍历

Posted xcfxcf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的遍历相关的知识,希望对你有一定的参考价值。

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

输入格式:

输入第一行给出一个正整数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

 

以上是关于树的遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历(递归+迭代)

二叉树的遍历方法之层序-先序-中序-后序遍历的简单讲解和代码示例

二叉树的遍历

根据二叉树的前序遍历和中序遍历构建二叉树的c语言完整代码

代码题— 二叉树的层次遍历

二叉树的遍历