文章目录

  • 题目分析
  • 题目链接

题目分析

分析
给了前序遍历和后序遍历,能够确定根结点,但是左子树和右子树的长度是不确定的。这里采用的解决方案是枚举左子树的结点个数,其实右子树的结点个数也确定了。对于每一段递归求可行的方案数量。

前序遍历 : [根结点][左子树][右子树]
后序遍历: [左子树][右子树][根结点]

写的dfs需要传入5个参数: 前序遍历的左端点l1和右端点r1,后序遍历的左端点l2和右端点r2 ,以及字符串in用来存合法的中序序列。

i是前序序列中左子树的右端点。从l1开始,最大到r1.
这样的话,左子树的区间就是[l1+1, i],这里之所以是l1+1,不是l1,是因为前序遍历第一个是根结点,之后才是左子树,相应地,前序中右子树的区间就是[i+1, r1] 。

然后后序序列中左子树对应的区间是哪一段呢? 后序遍历:是[左子树][右子树][根结点]的结构,刚开始的左端点是l2,右端点是r2, 左子树的区间应该是[l2, ?]右端点怎么确定? 根据区间长度来判断, 同一段在前序和后序中长度是一样的,所以 后序的右端点是 l2 +(i-l1 -1) .所以,后序序列中左子树对应的区间是[l2, l2 +(i-l1 -1)].

这样就构成了 第一个递归式子。同理可以得到第二个递归式子。

     // 左边区间的方案数int lcnt = dfs(l1+1, i ,l2, l2+ i -l1 -1,lin);//右边区间的方案数//后序遍历中右边区间的左端点就是 左边区间右边(l2+ i -l1 -1)的下一个int rcnt = dfs(i+1, r1, l2+ i -l1 -1+1 ,r2 -1,rin);

这个暴搜复杂度有点高,差不多是指数或者阶乘级的复杂度。

ac代码

#include<bits/stdc++.h>
using namespace std;
const int N =40;int pre[N] ,post[N];
int n;/*
dfs暴搜方案数
前序遍历两个端点l1,r1
后序遍历两个端点 l2 ,r2
*/
int dfs(int l1, int r1 , int l2, int r2, string& in){if(l1> r1) return 1; //此区间已空,是合法状态,方案数是1,if(pre[l1] != post[r2]) return 0; //不合法,方案数是0int cnt = 0; //记录总的可能的中序序列个数//枚举前序遍历左边区间的长度 ,其中i是左子树的右端点for(int i = l1; i <= r1; i++){string lin ,rin; //左右两边的序列是什么// 左边区间的方案数int lcnt = dfs(l1+1, i ,l2, l2+ i -l1 -1,lin);//右边区间的方案数//后序遍历中右边区间的左端点就是 左边区间右边(l2+ i -l1 -1)的下一个int rcnt = dfs(i+1, r1, l2+ i -l1 -1+1 ,r2 -1,rin);//合法方案if(rcnt && lcnt){//答案存在string中:左子树+根结点+右子树in  = lin + to_string(pre[l1]) +" "+ rin; cnt  += lcnt* rcnt; //方案数累加if(cnt > 1) break;}}return cnt; //返回方案数
}int main(){cin>> n;for(int i=0; i< n; i++) cin>> pre[i];for(int i=0; i< n; i++) cin>> post[i];string in;//答案记在in中//得到的中序遍历方案数int cnt = dfs(0 ,n-1, 0, n-1,in);if(cnt> 1) cout<<"No"<<endl;  //不止一个合法的中序序列else cout<<"Yes"<<endl;if(in.size()) { //虽然本题一定有解,in一定非空,不过任何pop操作还是加上判断非空要好。in.pop_back(); cout<<in <<endl;}
}

题目链接

PAT甲级1119 Pre- and Post-order Traversals (30分)

PAT甲级1119 Pre- and Post-order Traversals (30分):[C++题解]暴搜dfs、前序遍历和后序遍历求中序遍历相关推荐

  1. PAT甲级1151 LCA in a Binary Tree (30 分):[C++题解]LCA、最低公共祖先、哈希表映射

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 和下面这道题几乎是同一题:PAT甲级1143 Lowest Common Ancestor (30 分):[C++题解]LCA.最低 ...

  2. PAT甲级1087 All Roads Lead to Rome (30分):[C++题解]dijkstra求单源最短路综合、最短路条数、保存路径

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 首先这是一道dijkstra算法求最短路的题目,不过此题较为复杂.首先需要将字符串城市名映射成数字,这里使用hash table 名 ...

  3. PAT甲级1135 Is It A Red-Black Tree (30分):[C++题解]判断红黑树

    文章目录 题目分析 题目链接 题目分析 分析 给定前序遍历,同时红黑树一定是二叉搜索树,所以它的中序遍历就是从小到大排序.因此这道题是给定了前序遍历和中序遍历让建立二叉搜索树(BST). 数据结构中有 ...

  4. PAT甲级1115 Counting Nodes in a BST (30分):[C++题解] 递归建二叉搜索树、dfs求一层结点数量

    文章目录 题目分析 题目链接 题目分析 分析 首先本题给定的二叉搜索树的定义和其他地方的不同.本题小于等于的是左子树,右子树是大于根结点的. 然后说一下做题的思路. 给定一串数据,让构造二叉搜索树. ...

  5. PAT甲级1099 Build A Binary Search Tree (30分):[C++题解]建立二叉搜索树、dfs和bfs

    文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的结构,和待填的数值,请将数据填到二叉树中的结点中,使之满足二叉搜索树的性质. 然后按照层序遍历输出数值. 分析: 本题分两步. 第一步 ...

  6. PAT甲级 1151 LCA in a Binary Tree (30分) LCA算法/C++

    1151 LCA in a Binary Tree (30分) 题目大意:给出一棵树的中序和先序遍历,找到这棵树中U和V最小的共同祖先. Tips: 使用一个unordered_map记录中序遍历的值 ...

  7. 【PAT - 甲级1034】Head of a Gang (30分)(并查集)

    题干: One way that the police finds the head of a gang is to check people's phone calls. If there is a ...

  8. PAT甲级1043 Is It a Binary Search Tree :[C++题解]判断二叉搜索树BST、给定前序序列和中序序列

    文章目录 题目分析 题目链接 题目分析 二叉搜索树(BST):左子树小于根结点,右子树大于等于根结点. 二叉搜索树的中序遍历一定是有序序列.所谓中序遍历:先访问左子树,再访问根结点,最后访问右子树. ...

  9. PAT甲级1092 To Buy or Not to Buy :[C++题解]哈希表

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析 用unordered_map存每种珠子的个数,商店有的加上,伊娃需要的减去.这样哈希表中存的就是每种珠子的净值.大于0表示多余的,小于 ...

最新文章

  1. 实战解读丨Linux下实现高并发socket最大连接数的配置方法
  2. 终端安装解决svn cannot set LC_CTYPE locale的问题
  3. javascript 时间类型 Date
  4. Linux下编译OpenSSL
  5. cmpp java代码_cmpp.java 源代码在线查看 - cmpp的开发的短信端口实例 资源下载 虫虫电子下载站...
  6. 微众银行风险模型笔试前做的准备(公司介绍+欺诈与反欺诈+sql+机器学习)
  7. Win7 配置 Git 客户端 图文详解
  8. 两个pdf合并成一个pdf,操作方法
  9. matlab对摄像头实时运动目标检测,基于Matlab实时运动目标跟踪检测系统
  10. 无网卡驱动,电脑可以用Usb线联网
  11. python课堂教学_初中生初学python课堂教学感悟
  12. 深度学习经典论文汇总
  13. 嵌入式编程 交通灯显示
  14. SpringMVC创建Maven工程
  15. 天边美丽的彩云——参加2012年第四届中国云计算大会有感
  16. 几种关于用python的for循环求1到10的立方的方法
  17. Happy 2004(代码+积性函数扩展)
  18. 中国政府融资平台态势分析及发展前景规划评估研究报告2022-2028年版
  19. freemarker生成word之后遇到未解决的问题,希望有大佬赐教!!!
  20. 使用Docker快速部署Gitlab

热门文章

  1. 如果某一运行的服务在/var/lock/subsys
  2. Spring MVC 学习 之 - 拦截器
  3. 老平台已死,整理个文档留下做纪念
  4. 代码压缩、生成二维码
  5. 黑马程序员--数组与集合互相转变
  6. 用神经网络分类水和乙醇
  7. 一个训练集未知的神经网络
  8. 神经网络与中心场近似
  9. 【控制】根轨迹分析及绘制
  10. 5.10 程序示例--模型选择-机器学习笔记-斯坦福吴恩达教授