【CCCC】L2-006 树的遍历 (25分),根据后序与中序遍历建立二叉树

简介: 【CCCC】L2-006 树的遍历 (25分),根据后序与中序遍历建立二叉树

problem

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

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

problem

  • 题意:给出二叉树中序和后序遍历,求层次遍历
  • 建树:根据后序已知根,然后去中序里面找,找到后划分左右子树递归。
  • BFS遍历:按照Tree(l,r)层次遍历,vector累加答案。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 55;

int n, post[maxn], mid[maxn];
struct node{int l, r;}tree[maxn];
int build(int l1, int r1, int l2, int r2){//分别对应中序和后序的左右边界
    if(l1 > r1)return 0;
    int rt = post[r2], prt = l1;//1.后序确定根
    while(mid[prt]!=rt)prt++;//2.中序找根的位置
    int cnt = prt-l1;//3.中序确定左子树节点树
    tree[rt].l = build(l1,prt-1,l2,l2+cnt-1);//4.递归左子树
    tree[rt].r = build(prt+1,r1,l2+cnt,r2-1);//5.递归右子树
    return rt;
}

vector<int>ans;
void bfs(int rt){
    queue<int>q; q.push(rt);
    ans.push_back(rt);
    while(q.size()){
        int u = q.front();  q.pop();
        if(tree[u].l != 0){
            q.push(tree[u].l);
            ans.push_back(tree[u].l);
        }
        if(tree[u].r != 0){
            q.push(tree[u].r);
            ans.push_back(tree[u].r);
        }
    }
    for(int i = 0; i < ans.size()-1; i++)
        cout<<ans[i]<<" ";
    cout<<ans[ans.size()-1];
}


int main(){
    cin>>n;
    for(int i = 1; i <= n; i++)cin>>post[i];
    for(int i = 1; i <= n; i++)cin>>mid[i];
    int root = build(1,n,1,n);
    bfs(root);
    return 0;
}

目录
相关文章
|
7月前
【LeetCode】105. 从前序与中序遍历序列构造二叉树
题目描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例:
30 0
|
1月前
|
机器学习/深度学习 C++
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
|
5月前
|
C++ 索引
从前序与中序遍历序列构造二叉树(C++实现)
从前序与中序遍历序列构造二叉树(C++实现)
44 1
|
7月前
|
算法 C++
剑指offer(C++)-JZ86:在二叉树中找到两个节点的最近公共祖先(数据结构-树)
剑指offer(C++)-JZ86:在二叉树中找到两个节点的最近公共祖先(数据结构-树)
|
11月前
|
算法
【算法】二叉排序树:创建二叉树,并以中序遍历输出
【算法】二叉排序树:创建二叉树,并以中序遍历输出
186 0
【CCCC】L3-010 是否完全二叉搜索树 (30分),完全二叉树判断+层次遍历(奇怪的方法)
【CCCC】L3-010 是否完全二叉搜索树 (30分),完全二叉树判断+层次遍历(奇怪的方法)
62 0
|
人工智能 vr&ar
【CCCC】L2-004 这是二叉搜索树吗? (25分),二叉搜索树前序遍历
【CCCC】L2-004 这是二叉搜索树吗? (25分),二叉搜索树前序遍历
108 0
每日三题-二叉树的层序遍历、二叉树的中序遍历、最小覆盖子串
每日三题 二叉树的层序遍历 二叉树的中序遍历 最小覆盖子串
80 1
每日三题-二叉树的层序遍历、二叉树的中序遍历、最小覆盖子串