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. Warning: Hash history cannot PUSH the same path; a new entry will not be added to the history stack

    现象 在用`mobx-react-router`的`this.props.history.push("/")`的时候,浏览器会提示 Warning: Hash history ca ...

  2. Arcgis javascript api 动态图层自图层可见性设置

    Arcgis javascript api 动态图层自图层可见性设置 子图层管理 rest服务 sublayers sublayer ArcGISDynamicMapServiceLayer 本文主要 ...

  3. CEIWEI USBMonitor USB监控精灵 v2.3.2 USB过滤驱动 USB监控

    CEIWEI USBMonitor USB监控精灵 是一款监控USB端口协议分析软件,用于监控和分析USB设备协议,可以拦截.记录USB软件程序操作USB设备的In.Out数据包.支持监控分析USB票 ...

  4. AtCoder Beginner Contest 147 E. Balanced Path

    思路: dp,使用了bitset优化. 实现: #include <bits/stdc++.h> using namespace std; ; const int INF = 0x3f3f ...

  5. Django orm练习

    ORM练习题 models生成 from django.db import models # Create your models here. # 书籍管理 class Book(models.Mod ...

  6. 微信自研生产级paxos类库PhxPaxos实现原理介绍

    转载自:   http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483695&idx=1&sn=91ea4229 ...

  7. JAVA从文本文件(txt)读取一百万条数据保存到数据库

    Java读取大文本文件保存到数据库 1.追求效率 将文件读取到内存,效率比较高,经过测试读取1G左右的文本文件,机器内存消耗达到接近3个G,对内存消耗太大,不建议使用 2.通过调用第三方类库实现 通过 ...

  8. python之numpy和pandas

    一.numpy矩阵的拼接合并 列拼接:np.column_stack() >>> import numpy as np >>> a = np.arange(9).r ...

  9. Windows终端命令行工具Cmder

    在IT这一行,大部分情况下都是推荐大家使用Linux或者类Unix操作系统去编程,Linux作为一代优秀的操作系统,已经人尽皆知,在IT行业已经成为核心.有条件的大佬都选择了使用mac编程,最优秀的莫 ...

  10. Matlab脚本和函数

    脚本和函数 脚本: 特点:按照文件中所输入的指令执行,一段matlab指令集合.运行后,运算过程产生的所有变量保存在基本工作区.可以进行图形输出,如plot()函数. 举例: 脚本文件ex4_15.m ...