L2-011. 玩转二叉树

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。(我的分析:无非就是说把左子树当成右子树,把右子树当成左子树;没啥多的影响,就是输出的时候先左后右即可了)!这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(<=30)(分析:假设它是一棵斜二叉树,它的深度上限将达到1e9! 数组是会炸的!),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以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.然后BFS层序遍历时,按照镜像原则——反着先右子树后左子树。
 3.这题的数据真的严格,假设是一棵深度为30的二叉树,大约需要1000000000的数组大小来开! 试了几个都段错误了!在网上看了很多题解,大多都是用链表来写的!而我比较懒,又恰巧想到了一个真的简单的方法,于是乎就用数组进行实现了,并且就开到了100大!于是动手就实现了!
 
AC代码:
//注意,头文件私奔了!!!自行找回!
#define inf 0x3f3f3f3f
using namespace std;
#define N 108
struct node{
int data;
int l,r;
}tree[N];//用Time方式来依次记录建立的节点的序号!
int Time;
vector<int>ans;
void build_tree(int root,vector<int>a,vector<int>b){//a前序b中序
if(a.size()==)return ;//递归调用结束的条件!
int p=;
for(int i=;i<(int)b.size();i++){
if(b[i]==a[]){
p=i;break;//在中序b中的找当前根节点的下标
}
}
vector<int>al,ar,bl,br;
for(int i=;i<=p;i++)
al.push_back(a[i]);
for(int i=p+;i<=(int)a.size()-;i++)
ar.push_back(a[i]); for(int i=;i<=p-;i++)
bl.push_back(b[i]);
for(int i=p+;i<=(int)b.size()-;i++)
br.push_back(b[i]); tree[root].data=a[];//确定根节点(立即存储),然后递归处理
tree[root].l=++Time;
tree[root].r=++Time;
build_tree(tree[root].l,al,bl);
build_tree(tree[root].r,ar,br);
}
void bfs(){//层序遍历
queue<node>Q;
Q.push(tree[]);
node now;
while(Q.size()){
now=Q.front();Q.pop();
if(now.data==-)continue;//到底了!
ans.push_back(now.data); Q.push(tree[now.r]);//镜像结构层序遍历时,先右子树后左子树
Q.push(tree[now.l]);
}
}
int main(){
int x;
int n;
vector<int>a,b;
while(scanf("%d",&n)!=EOF){
a.clear();b.clear(); for(int i=;i<=n;i++){
scanf("%d",&x);b.push_back(x);
}
for(int i=;i<=n;i++){
scanf("%d",&x);a.push_back(x);
}
for(int i=;i<N;i++)
tree[i].data=-;
Time=;
build_tree(++Time,a,b); ans.clear();//存结果
bfs();
for(int i=;i<=n-;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n-]);
} return ;
}

【PAT-二叉树】L2-011. 玩转二叉树- 仅仅开100大的数组模拟即可!的更多相关文章

  1. pat 团体天梯赛 L2-011. 玩转二叉树

    L2-011. 玩转二叉树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜 ...

  2. 团体程序设计天梯赛-练习集L2-011. 玩转二叉树

    L2-011. 玩转二叉树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜 ...

  3. 团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树

    L2-006. 树的遍历 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...

  4. L2-011. 玩转二叉树(不建树)

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

  5. 玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历

    基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点 ...

  6. javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

  7. 【algo&ds】【吐血整理】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表

    本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢. 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结 ...

  8. 遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化

    遍历二叉树   traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化 1. 二叉树3个基本单元组成:根节点.左子树.右子树 以L.D.R ...

  9. 剑指offer24:二叉树中和为输入整数值的所有路径。(注意: 在返回值的list中,数组长度大的数组靠前)

    1 题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长 ...

随机推荐

  1. 【GStreamer开发】GStreamer基础教程14——常用的element

    目标 本教程给出了一系列开发中常用的element.它们包括大杂烩般的eleemnt(比如playbin2)以及一些调试时很有用的element. 简单来说,下面用gst-launch这个工具给出一个 ...

  2. 最新 蓝鲸人java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 蓝鲸人等10家互联网公司的校招Offer,因为某些自身原因最终选择了 蓝鲸人.6.7月主要是做系统复习.项目复盘.Leet ...

  3. Python-03-流程控制

    一.if判断语句 1. if...else if 条件: 满足条件时要做的事情1 满足条件时要做的事情2 ...... else: 不满足条件时要做的事情1 不满足条件时要做的事情2 ...... # ...

  4. 湖北校园网PC端拨号算法逆向

    湖北校园网PC端拨号算法逆向 前言 上一文 PPPoE中间人拦截以及校园网突破漫谈我们谈到使用 PPPoE 拦截来获取真实的账号密码. 在这个的基础上,我对我们湖北的客户端进行了逆向,得到了拨号加密算 ...

  5. Python 在气象上的应用

    Python 在气象上的应用 grug350关注 0.7892019.03.15 23:19:31字数 913阅读 1,024 为什么选择python 免费和开源,没有商业许可限制anaconda p ...

  6. vijo 1456最小总代价

    题意:中文题... 题解:状态比较多,可以说是状压的基础题吧,我们定义dp[i][j],j为一个二进制数,每位0表示接触过该物品,1表示没有接触过;j表示当前物品在谁手上.递推的顺序注意一下就好 ac ...

  7. [A]System.Web.WebPages.Razor.Configuration.HostSection 无法强制转换为 [B]解决办法

  8. GOF学习笔记1:术语

    1.abstract class 抽象类定义了一个接口,把部分或全部实现留给了子类,不能实例化. 2.abstract coupling  抽象耦合如果一个类A引用了另一个抽象类B,那么就说A是抽象耦 ...

  9. 《图解HTTP》读后总结

    阅读时间:2019.10.30-2019.11.6 阅读心得: 从知乎上看到有人推荐这本书,本身对计算机网络方面学习的比较少,于是就买来这本书开始看.这本书总体看下来比较轻松,因为书中的插画非常卡通, ...

  10. Springboot2.x整合Redis以及连接哨兵模式/集群模式

    依赖: <!--spirngboot版本为2.x--><!-- 加载spring boot redis包,springboot2.0中直接使用jedis或者lettuce配置连接池, ...