题目描述:给出二叉树的后序和中序序列,输出二叉树的层序遍历序列。

题目分析:中序遍历为左根右,后序遍历为左右根,所以后序遍历的最后一个节点为根节点,在中序遍历上找出根节点的位置,将树分为左右两个子树。

使用 in[],post[] 存储中序后后序序列。假设某个分支二叉树中序区间为[inL, inR],后序区间为[postL,postR],那么post[postR]就为该树的根节点,根据根节点去中序中查找,找到根节点在中序中的位置为k。二叉树左子树的个数为numLeft=k-inL。左子树的中序区间为[inL,k-1],右子树的中序区间[k+1,inR];左子树的后序区间为[postL,postL+numLeft-1],右子树的后序区间为[postL+numLeft,postR-1]。

创建树时返回根节点的地址。最后层序遍历树,使用队列,从根节点开始,将节点入队,然后读队首,再出队直至队列为空。

代码如下:

#include <iostream>
#include <queue>
using namespace std;
const int N = 1010;
int in_order[N], post_order[N];
int n;struct node {int data;node *lchild;node *rchild;
};node *build(int inL, int inR, int postL, int postR) {if (inL > inR)return NULL;node *root;root = new node;root->data = post_order[postR];int k = inL;while (in_order[k] != root->data)k++;int numLeft = k - inL;root->lchild = build(inL, k - 1, postL, postL + numLeft - 1);root->rchild = build(k + 1, inR, postL + numLeft, postR - 1);return root;
}void bfs(node *root) {int num = 0;queue<node *>q;q.push(root);while (q.size()) {node *now = q.front();q.pop();cout << now->data;num++;if (num < n)cout << " ";if (now->lchild != NULL)q.push(now->lchild);if (now->rchild != NULL)q.push(now->rchild);}
}int main() {cin >> n;for (int i = 0; i < n; i++)cin >> in_order[i];for (int i = 0; i < n; i++)cin >> post_order[i];node *root = build(0, n - 1, 0, n - 1);bfs(root);return 0;
}

测试结果:

题目分析链接:
https://blog.csdn.net/weixin_39851956/article/details/105253197

根据后序和中序求二叉树的层序相关推荐

  1. 数据结构----二叉树已知先序和中序遍历序列求后序遍历

    说明 通过先序和中序或者中序和后序我们可以还原出原始二叉树,但是通过先序和后序是无法还原出原始二叉树也即是说,只有通过先序和中序,或者中序和后序我们才可以唯一的确定一个二叉树. 例子一 已知先序和中序 ...

  2. 二叉树:已知先序和中序求后序,已知中序和后序求先序

    树的三种遍历方式的遍历顺序: 先序遍历:根.左子树.右子树(特点:第一个元素为根) 中序遍历:左子树.根.右子树(特点:根的两边分别为左子树和右子树) 后序遍历:左子树.右子树.根(特点:最后一个元素 ...

  3. 【C++】已知二叉树先序遍历+中序遍历 求后序遍历

    题目:已知二叉树先序遍历+中序遍历 求后序遍历 对于一棵二叉树,给定其先序遍历的结果序列和中序遍历的结果序列,请写出其后序遍历的结果序列. 输入样例: GDAFEMHZ(先序遍历的结果序列) ADEF ...

  4. 给定二叉树先序、中序遍历序列,求后序遍历

    给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列. 输入描述: 输入为一行. 两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔.保证数据合法 输出描述: 对应输 ...

  5. C语言学习笔记——根据二叉树的后序和中序遍历序列,求这棵树的先序和层次遍历序列

    先根据二叉树的后序和中序遍历序列,用递归的方法创建出这棵树,然后用的自定义栈的先序和层次方法遍历. 输入:  7 2 3 1 5 7 6 4                      1 2 3 4 ...

  6. 二叉树先序遍历,中序遍历,后序遍历,层次遍历学习总结及完整C/C++代码

    伪代码阐述 先序遍历 先序遍历:先访问根节点, 然后深入左子树,直到不能深入时再深入右子树 由定义可得递归式 void travPre_R(BinNodePosi* x,VISIT& visi ...

  7. 二叉树遍历——前序、后序和中序遍历

    转载:数据结构(五):前序遍历.中序遍历.后序遍历_别把BUG不当代码的博客-CSDN博客_前序中序后序遍历 我们先看下二叉树的前序.后序和中序遍历.遍历下面这个二叉树,分别以前中后三种遍历方式,写出 ...

  8. 二叉树的三种遍历方式:先序,中序,后序

    二叉树遍历基础概念分析: 遍历:编写程序时,读取二叉树中内容的顺序(本人理解为此). 先序/中序/后序:二叉树的先序,中序,后序中的"先中后"是相对于"根"而言 ...

  9. 常考数据结构与算法:实现二叉树先序,中序和后序遍历

    题目描述 分别按照二叉树先序,中序和后序打印所有的节点. 输入 {1,2,3} 返回值 [[1,2,3],[2,1,3],[2,3,1]] import java.util.ArrayList;cla ...

最新文章

  1. 擦掉纹身的AI火了:再现无暇皮肤,网友却发现“伏地魔” | Reddit热议
  2. LeetCode 213 House Robber II Python
  3. 20210831 Ubuntu安装Gnome图形界面
  4. Google AdSense 帐户已被停用
  5. 常用软件滤波算法---摘自:FeoTech
  6. 从医院到家,再重返SAP成都研究院
  7. 车厢重组(信息学奥赛一本通-T1310)
  8. fanuc机器人自动程序前怎么回原点_FANUC机器人的执行程序
  9. oracle函数大全指数运算,Oracle 基础语句 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数......
  10. android白圈闪现动画,Android基于Shader的图像处理(9)-仿抖音闪白特效
  11. 【个人笔记】OpenCV4 C++ 图像处理与视频分析 08课
  12. Mac触发角锁屏不睡眠
  13. 106 网络编程实战之基于socketserver实现多用户FTP服务器
  14. LINUX查询版本情况
  15. Jupyter处理大量数据导致内存溢出 网页崩溃的解决办法
  16. 渗透H5棋牌游戏-棋牌游戏开发
  17. 云南计算机一级c类基础知识,云南省大学计算机一级C类多选题及答案.pdf
  18. 《 硬件创业:从产品创意到成熟企业的成功路线图》——1.2 当前的技术
  19. Cardboard -VR全景浏览
  20. Cordova打包Scratch为APP

热门文章

  1. 【ArcGIS遇上Python】ArcGIS python计算长时间序列多个栅格数据的平均值
  2. linux之如何在任意目录执行我常用的脚本文件
  3. Android之如何用dextra.ELF64查看安卓手机“设置“图标的源代码
  4. linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
  5. linux 配置path
  6. windows7 nginx php mysql_windows7配置Nginx+php+mysql的详细教程
  7. 二项式定理的几何视觉演示再次来袭,这次你看懂了吗?
  8. 连接数学和美学的--西奥多罗斯螺旋
  9. seata xid是什么_使用Seata彻底解决Spring Cloud中的分布式事务问题!
  10. 区块链浏览器_全球首款区块链浏览器是啥名堂?傲游6首发体验