题目:

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
1 2 3 4 5 6 7
4 1 3 2 6 5 7

输出样例:

4 6 1 7 5 3 2

分析:

知道二叉树的知知中序遍历和前序遍历,求后序遍历
1.镜面反转:这个其实就只要在递归的时候先递归右树,再递归左树就好;
2.层序遍历:

不同的层放在一个vector中,每层可以区分开,在递归过程中,当做一个完全满二叉树来看,初始化vector数组为-1(表示二叉树节点都为Null),将每个值放在对应节点上,输出时,特判一下-1(即为空)的状态即可。
3.复习:创建vector容器的三种方式
(1)不指定元素个数:

vector<int>v;

(2)指定容器的大小

vector<int>v(10);

(3)指定容器的大小,且每个元素具有指定的初始值。

vector<double>(10,8.6);

4.利用递归,从前序一个个元素开始,root=1; 在中序中找到a[root]==b[i]a[root]==b[i]a[root]==b[i],
然后将中序分为两部分,b[1.....i−1]和b[i+1.....n]b[1.....i-1] 和b[i+1.....n]b[1.....i−1]和b[i+1.....n],然后分别遍历这两
部分,直到这两部分元素为0(x>y) 或1个(x==y);

  • 左子树 ,左子树范围必定在x到i-1之间,下一个根的位置在root+1
  • 右子树,右子树范围必定在i+1到y之间,根的位置就是(i-x)是左子树
    的大小,相当于root位置往后移左子树的个数再加一

前序遍历:根左右
中序遍历:左根右
后序遍历:左右根

AC代码:

#include <iostream>
#include<stdio.h>
#include <vector>
#define N 31
using namespace std;
int a[N],b[N];
vector<int> ve(100000,-1);
void build(int x,int y,int root,int step)/**x,y为左子树或右子树的区间,root为根节点,step为当前根节点的位置(满二叉树)*/
{if(x>y) return;ve[step]=a[root];/**记录当前根节点的位置*/int i;for(i=x;i<=y;++i){if(a[root]==b[i])break;}build(i+1,y,root+(i-x)+1,step*2+1);build(x,i-1,root+1,step*2+2);/**镜面这个其实就只要在递归的时候先递归右树,再递归左树就好*/
}
int main()
{int n;cin>>n;for(int i=1;i<=n;++i)cin>>b[i];for(int i=1;i<=n;++i)cin>>a[i];build(1,n,1,0);int cnt=0;for(int i=0;i<ve.size()&&cnt<=n;++i){if(ve[i]!=-1){if(i)cout<<" ";cout<<ve[i];++cnt;}}return 0;
}

玩转二叉树 (25 分) 知中序遍历和前序遍历,求做个镜面反转后的层序遍历相关推荐

  1. 7-11 玩转二叉树 (25 分)

    7-11 玩转二叉树 (25 分) 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的 ...

  2. 【CCCC】L2-011 玩转二叉树 (25分),二叉树建树与遍历(我讨厌树,@L2-006)

    problem L2-011 玩转二叉树 (25分) 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设 ...

  3. 7-2 玩转二叉树 (25分)_2-1!72分钟绝杀!西乙黑马踢疯了,西班牙人+武磊却迎利好...

    西乙联赛第7轮,拉斯帕尔马斯又赢球了,这支球队2-1的比分取胜,拿到3分后,拉斯帕尔马斯已经保持了6轮不败,势头非常不俗,这支球队已经成为了西班牙人升级的主要对手之一,不过西班牙人也隔空收获一大利好, ...

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

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

  5. 7-23 还原二叉树 (25 分)(分析加详解)

    一:题目: 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. 输入格式: 输入首先给出正整数N(≤50),为树中结点总数.下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重 ...

  6. (2)二叉树由后序(LRD)和中序(LDR)得到前序(DLR)

    二叉树由后序(LRD)和中序(LDR)得到前序(DLR) 具体代码 /* DCBHKGFEA 后序 BDCAEHGkF 中序 ABCDEFGHK 前序思路:根据后序找根节点->分割中序-> ...

  7. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  8. “中序表达式”转换为“前序表达式”、“后序表达式”

    上周末参照书本写了个"计算器"的程序,其中最令我费解的就是"前序表达式"."后续表达式",好像记得老师在上课的时候讲过,估计当时也没听懂,看 ...

  9. 二叉树经典问题——已知中序和前序重建二叉树

    运用前序和中序序列重建二叉树及其相关应用## 重建过程 1,在二叉树的学习中经常会遇到一类问题,就是给出一棵二叉树的前序和中序序列(后序和中序类似)然后求树的深度.树的后序序列.树的各种遍历等等问题, ...

最新文章

  1. 面向Mobile device的CNN模型手工设计与NAS分析总结,MobileNet V1,V2,V3,Efficient,MNasNet以及Efficient network design
  2. Linux(ubuntu)下安装anaconda(64位)并配置jupyter notebook远程访问
  3. 重拾CCNA,学习笔记持续更新ing......(4)
  4. java bean工厂_java-将Service用作“工厂”以返回不同的Bean...
  5. php dirtoarray,PHP Ds\Stack toArray()用法及代码示例
  6. python实验八分支语句_python语句(分支,循环)
  7. IT NEWS WebSite
  8. WPF 位置转化和动画
  9. Mysql 时间格式默认空串 ‘0000-00-00 00:00:00‘ select抛出异常的解决方法
  10. OpenCV之分离和合并颜色通道
  11. linux 一次对一个用户限制存取
  12. python 【递归 及 二分法】
  13. PLC(S7-200)通过自由通讯口方式与变频器通讯(VLT)
  14. Java实现顺序表的创建及基本操作(增删改查)
  15. DDoS的攻击方式和防御方法
  16. 《大众创业做电商——淘宝与微店 开店 运营 推广 一册通》一一2.5 O2O电子商务模式...
  17. process monitor解决网络问题一则
  18. JavaSE基础练习题
  19. yolov3运行及保存检测视频(包括摄像头)
  20. 详解awk(一)awk基础知识、选项、程序段解析与实例

热门文章

  1. 子窗体菜单合并到父窗体菜单的解决办法
  2. IOS学习笔记十八(copy、mutableCopy、NSCopying、NSMutableCopy、深复制、浅复制)
  3. C和指针之字符操作(<ctype.h>)
  4. sql in 用法(mysql)
  5. 表头合并_多个Excel表格合并数据麻烦?试试Power Query轻松帮你解决
  6. 没有主清单属性_原神:晴知的主C诺艾尔大型进阶攻略初版
  7. python字典和集合对象可以进行索引_Python字典和集合
  8. 甘肃2019年9月计算机二级报名入口,2019年9月甘肃计算机二级考试成绩查询入口...
  9. 小手工纸盒机器人_亲子手工 | DIY弹珠迷宫小黑手自制玩具系列
  10. 如果边横向移动边扔球,球会怎么运动?