【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;
}

目录
相关文章
排序二叉树的创建及先序、中序、后序输出二叉树
排序二叉树的创建及先序、中序、后序输出二叉树
58 1
|
6月前
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
41 0
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
25 0
|
5月前
|
算法
二叉树删除节点算法---递归
二叉树删除节点算法---递归
|
6月前
|
机器学习/深度学习 C++
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)
|
存储 算法 C语言
【树】你真的会二叉树了嘛? --二叉树LeetCode专题Ⅱ
这里有两种方法(深度优先搜索与广度优先搜索)其实也就是前序遍历与层序遍历,层序遍历这里简单提一下.与上面的大同小异就不过多赘述了:依旧是遍历出每一层最大的值,将其放入数组即可.
67 0
|
算法
【算法】二叉排序树:创建二叉树,并以中序遍历输出
【算法】二叉排序树:创建二叉树,并以中序遍历输出
216 0
每日三题-二叉树的层序遍历、二叉树的中序遍历、最小覆盖子串
每日三题 二叉树的层序遍历 二叉树的中序遍历 最小覆盖子串
103 1
每日三题-二叉树的层序遍历、二叉树的中序遍历、最小覆盖子串
【CCCC】L3-010 是否完全二叉搜索树 (30分),完全二叉树判断+层次遍历(奇怪的方法)
【CCCC】L3-010 是否完全二叉搜索树 (30分),完全二叉树判断+层次遍历(奇怪的方法)
87 0
|
人工智能 vr&ar
【CCCC】L2-004 这是二叉搜索树吗? (25分),二叉搜索树前序遍历
【CCCC】L2-004 这是二叉搜索树吗? (25分),二叉搜索树前序遍历
140 0