文章目录

  • 题目分析
  • 题目链接

题目分析


题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列。

分析:

后序遍历:先 左子树、右子树 ,最后再遍历根结点。

中序遍历:先左子树,再根结点,然后是右子树。

给定中序序列和后续序列,便可以唯一确定这棵二叉树的形状。

由于后序遍历最后遍历根结点,所以最后一个就是根结点。 找到根结点的值,我们就可以在中序序列中找到根结点,从而把中序序列分成左子树、根结点、右子树三部分。 这三部分也可以在后序序列中找到对应的部分。

然后对于后序序列的各个部分,递归上面这个过程,先找到这个部分的根结点,再对应到中序序列,把中序序列的这一部分再分成左子树、根结点、右子树三部分……

这里需要用到hash表l和r,分别用来存一个结点的左儿子 和右儿子。这样查找某结点是否存在儿子,就方便很多。
ac代码

#include<bits/stdc++.h>
using namespace std;const int N =40;int n;
int postOrder[N], inOrder[N];unordered_map<int,int> l,r,pos; //l和r存左右儿子,pos存中序遍历每个值的下标
int q[N];/*build函数:根据中序序列和后序序列建树,返回树根il:中序序列左端点;ir:中序序列右端点pl:后序序列左端点;pr:后序序列右端点
*/
int  build(int il, int ir, int pl ,int pr){int root = postOrder[pr];  //在后序序列中找到根结点的值,存在root中int k =pos[root];// 根结点在中序序列中的位置//看中序序列//中序序列中存在左子树if(il < k){//左子树的树根 就是 root的左儿子l[root] = build(il,k-1, pl,pl+(k-1-il));}//中序序列中存在右子树if(k<ir){//右子树的树根就是root的右儿子r[root] = build(k+1,ir,pl+(k-1-il)+1,pr-1);}return root; //返回树根
}
/*
bfs:层次遍历
手写队列*/
void bfs(int root){int hh =0 ,tt =0;q[0] =root;  //q[0]为根结点while(hh<=tt){ //队列不空int t =q[hh++]; //取队首元素//左子树存在,左子树的树根加入队列if(l.count(t)) q[++tt] =l[t];  //左儿子存在加入队列//右子树存在,右子树的树根加入队列if(r.count(t)) q[++tt] =r[t]; //右儿子存在加入队列}cout<<q[0];for(int i=1;i<n;i++) cout<<" "<<q[i];
}int main(){cin>> n;for(int i=0; i<n;i++) cin>> postOrder[i];for(int i=0;i<n;i++){cin>>inOrder[i];pos[inOrder[i]] =i; //记录每个值在中序序列中的位置}int root = build(0,n-1,0,n-1);bfs(root);}

题目链接

PAT甲级1020 Tree Traversals

PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树相关推荐

  1. PAT甲级1086 Tree Traversals Again:[C++题解]二叉树中序序列、栈、求后序遍历

    文章目录 题目分析 题目链接 题目分析 分析: 给定栈模拟的二叉树的中序序列. 我们可以发现一些性质: 1 第一个值是根结点. 2 对于所有的push操作,如果上一个是push,该结点就是上一个结点的 ...

  2. 03-树3 Tree Traversals Again(树的遍历)

    03-树3 Tree Traversals Again 分数 25 作者 陈越 单位 浙江大学 An inorder binary tree traversal can be implemented ...

  3. 1079. Total Sales of Supply Chain (25)-PAT甲级真题(dfs,bfs,树的遍历)

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  4. PAT甲级刷题记录-(AcWing)-(Day06树 8题)

    PAT甲级刷题记录-(AcWing)-(Day06树 8题) 课程来源AcWing 其中AcWing中的题目为翻译好的中文题目 今日刷题列表 1110 Complete Binary Tree 111 ...

  5. 1020. Tree Traversals (25)

    题目链接:http://www.patest.cn/contests/pat-a-practise/1020 题目: 1020. Tree Traversals (25) 时间限制 400 ms 内存 ...

  6. PAT甲级题目翻译+答案 AcWing(树)

    1004 Counting Leaves (30 分) 题意 : 家庭关系可以用家谱树来表示,给定一个家谱树,你的任务是找出其中没有孩子的成员. 第一行包含一个整数 N 表示树中结点总数以及一个整数 ...

  7. PAT甲级1020(附带前中序遍历の绝对干货)

    引子 我之前对遍历推导这块没怎么动脑子,凭感觉.所以这题是先参考了百度经验,别笑,这个链接,我觉得讲得非常清楚. https://jingyan.baidu.com/article/cdddd41cb ...

  8. PAT甲级1020变体:已知二叉树层序+中序序列,求后序遍历序列

    PAT甲级1020变体:已知二叉树层序+中序序列,求后序遍历序列 题目 输入格式 输出格式 输入样例 输出样例 代码 题目 已知二叉树层序+中序序列,求后序遍历序列. 输入格式 第一行给出该二叉树的节 ...

  9. 1020 Tree Traversals

    1. 有这样一个经典结论:中序序列可以和先序序列.后序序列.层序序列中的任意一个来构建唯一的二叉树,而后三者两两搭配或者三个一起上都不行.因为从本质上来说,后三者都只提供根结点,只有通过中序才能区分左 ...

最新文章

  1. 【牛客网】最长对称子串
  2. Java3大框架的学习都是什么
  3. 人工智能基础-算法工程师为什么要懂线性代数?
  4. Solaris 11的ip地址配置
  5. 大学计算机绘图配置,大学计算机绘图试题及答案(二)
  6. IntelliJ IDEA——数据库集成工具(Database)的使用
  7. 抢车位app下载_太方便了!有了这个APP,找车位再也不用“兜圈子”了
  8. 数据库基础知识(面试)
  9. 七牛sdk 上传视频 - 前端
  10. [论文阅读笔记29]生物医学文本摘要(Biomedical Text Summarization)
  11. 计算机图形学【GAMES-101】10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)
  12. 电子元件知识汇总3-厂商
  13. mysql典型安装和完全安装的区别_MySQL安装详解(安装版本mysql-5.5.25)
  14. h5学习笔记:rem单位在一些安卓机计算异常
  15. 关于成本核算方法、步骤、成本分析
  16. Python Selenium库的使用
  17. 数据库插入大量数据时不要忘记先删除索引(小技巧)
  18. 国家电网计算机专业考试科目,2019国家电网考试科目:你的专业都考什么?
  19. Beta冲刺-第一天
  20. FIX协议介绍与QuickFIX使用入门(上)

热门文章

  1. OpenStack和Redis
  2. javascript中函数作用域和声明提前
  3. 1019.Line Painting(线段树 离散化)
  4. poj 1716 差分约束
  5. GERBER文件格式简介
  6. mysql某个表被行锁了_MySQL中的锁(表锁、行锁)
  7. 机器学习中的评价指标--1[F,P,R]
  8. yum 安装PHP之后如何启动,如何用yum安装php_后端开发
  9. access期刊可以重投几次_又被拒稿了?老司机带你一投即中
  10. 1.7 程序示例--多项式回归-机器学习笔记-斯坦福吴恩达教授