PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树
文章目录
- 题目分析
- 题目链接
题目分析
题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列。
分析:
后序遍历:先 左子树、右子树 ,最后再遍历根结点。
中序遍历:先左子树,再根结点,然后是右子树。
给定中序序列和后续序列,便可以唯一确定这棵二叉树的形状。
由于后序遍历最后遍历根结点,所以最后一个就是根结点。 找到根结点的值,我们就可以在中序序列中找到根结点,从而把中序序列分成左子树、根结点、右子树三部分。 这三部分也可以在后序序列中找到对应的部分。
然后对于后序序列的各个部分,递归上面这个过程,先找到这个部分的根结点,再对应到中序序列,把中序序列的这一部分再分成左子树、根结点、右子树三部分……
这里需要用到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++题解]树的遍历、由中序序列和后序序列递归建树相关推荐
- PAT甲级1086 Tree Traversals Again:[C++题解]二叉树中序序列、栈、求后序遍历
文章目录 题目分析 题目链接 题目分析 分析: 给定栈模拟的二叉树的中序序列. 我们可以发现一些性质: 1 第一个值是根结点. 2 对于所有的push操作,如果上一个是push,该结点就是上一个结点的 ...
- 03-树3 Tree Traversals Again(树的遍历)
03-树3 Tree Traversals Again 分数 25 作者 陈越 单位 浙江大学 An inorder binary tree traversal can be implemented ...
- 1079. Total Sales of Supply Chain (25)-PAT甲级真题(dfs,bfs,树的遍历)
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- PAT甲级刷题记录-(AcWing)-(Day06树 8题)
PAT甲级刷题记录-(AcWing)-(Day06树 8题) 课程来源AcWing 其中AcWing中的题目为翻译好的中文题目 今日刷题列表 1110 Complete Binary Tree 111 ...
- 1020. Tree Traversals (25)
题目链接:http://www.patest.cn/contests/pat-a-practise/1020 题目: 1020. Tree Traversals (25) 时间限制 400 ms 内存 ...
- PAT甲级题目翻译+答案 AcWing(树)
1004 Counting Leaves (30 分) 题意 : 家庭关系可以用家谱树来表示,给定一个家谱树,你的任务是找出其中没有孩子的成员. 第一行包含一个整数 N 表示树中结点总数以及一个整数 ...
- PAT甲级1020(附带前中序遍历の绝对干货)
引子 我之前对遍历推导这块没怎么动脑子,凭感觉.所以这题是先参考了百度经验,别笑,这个链接,我觉得讲得非常清楚. https://jingyan.baidu.com/article/cdddd41cb ...
- PAT甲级1020变体:已知二叉树层序+中序序列,求后序遍历序列
PAT甲级1020变体:已知二叉树层序+中序序列,求后序遍历序列 题目 输入格式 输出格式 输入样例 输出样例 代码 题目 已知二叉树层序+中序序列,求后序遍历序列. 输入格式 第一行给出该二叉树的节 ...
- 1020 Tree Traversals
1. 有这样一个经典结论:中序序列可以和先序序列.后序序列.层序序列中的任意一个来构建唯一的二叉树,而后三者两两搭配或者三个一起上都不行.因为从本质上来说,后三者都只提供根结点,只有通过中序才能区分左 ...
最新文章
- 【牛客网】最长对称子串
- Java3大框架的学习都是什么
- 人工智能基础-算法工程师为什么要懂线性代数?
- Solaris 11的ip地址配置
- 大学计算机绘图配置,大学计算机绘图试题及答案(二)
- IntelliJ IDEA——数据库集成工具(Database)的使用
- 抢车位app下载_太方便了!有了这个APP,找车位再也不用“兜圈子”了
- 数据库基础知识(面试)
- 七牛sdk 上传视频 - 前端
- [论文阅读笔记29]生物医学文本摘要(Biomedical Text Summarization)
- 计算机图形学【GAMES-101】10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)
- 电子元件知识汇总3-厂商
- mysql典型安装和完全安装的区别_MySQL安装详解(安装版本mysql-5.5.25)
- h5学习笔记:rem单位在一些安卓机计算异常
- 关于成本核算方法、步骤、成本分析
- Python Selenium库的使用
- 数据库插入大量数据时不要忘记先删除索引(小技巧)
- 国家电网计算机专业考试科目,2019国家电网考试科目:你的专业都考什么?
- Beta冲刺-第一天
- FIX协议介绍与QuickFIX使用入门(上)
热门文章
- OpenStack和Redis
- javascript中函数作用域和声明提前
- 1019.Line Painting(线段树 离散化)
- poj 1716 差分约束
- GERBER文件格式简介
- mysql某个表被行锁了_MySQL中的锁(表锁、行锁)
- 机器学习中的评价指标--1[F,P,R]
- yum 安装PHP之后如何启动,如何用yum安装php_后端开发
- access期刊可以重投几次_又被拒稿了?老司机带你一投即中
- 1.7 程序示例--多项式回归-机器学习笔记-斯坦福吴恩达教授