CCCC题集 L2-006. 树的遍历 ( 二叉树性质

本文介绍了一种算法,该算法可以根据给定的二叉树后序遍历和中序遍历序列,输出对应的层序遍历序列。通过构建二叉树并运用广度优先搜索(BFS),实现了从后序和中序遍历到层序遍历的有效转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

L2-006. 树的遍历

题目描述

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

输入

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

题意

由中序遍历与后序遍历可以建立出这个树,然后对这个树进行BFS就可以得到层次遍历了QAQ

AC代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define LL long long
#define CLR(a,b) memset(a,(b),sizeof(a))

const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+11;
struct node {
    int l, r;
    int id, h;
}tree[MAXN];
int n, len;
int arr[MAXN], brr[MAXN];

int find(int l, int r, int root) {
    for(int i = l; i <= r; i++) {
        if(brr[i] == root) return i;
    }
}
void build(int l, int r, int root, int u) {
    if(l > r) return ;
    int k = find(l,r,arr[root]);
    if(l < k) {
        tree[++len].id = arr[root-(r-k)-1];
        tree[len].h = tree[u].h+1;
        tree[u].l = len;
        build(l,k-1,root-(r-k)-1,len);
    }
    if(r > k) {
        tree[++len].id = arr[root-1];
        tree[len].h = tree[u].h+1;
        tree[u].r = len;
        build(k+1,r,root-1,len);
    }
    return ;
}
void bfs() {
    queue<int> que;
    que.push(1);
    while(!que.empty()) {
        int k = que.front();
        if(tree[k].l != -1) que.push(tree[k].l);
        if(tree[k].r != -1) que.push(tree[k].r);
        if(n > 1)
            cout << tree[k].id << " ";
        else
            cout << tree[k].id << endl;
        n--;
        que.pop();
    }
    return ;
}
int main() {
    cin >> n;
    for(int i = 1; i <= n; i++ )
        cin >> arr[i];
    for(int i = 1; i <= n; i++ )
        cin >> brr[i];
    for(int i = 1; i <= n; i++) {
        tree[i].id = 0;
        tree[i].l = -1;
        tree[i].r = -1;
        tree[i].h = 0;
    }
    len = 1;
    tree[1].id = arr[n];
    tree[1].h = 1;
    build(1,n,n,1);
    bfs();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值