传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=5225

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte

描述

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

输入

输入第一行给出一个正整数N(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

思路:构树:根据先序遍历中的值,去中序遍历中分割左右子树,然后递归构建二叉树

   交换左右孩子:类似于冒泡排序中的交换,把一个根节点的左右孩子交换一下,之后也是递归对左右孩子的都进行交换(其实也可以不用交换的,入队列的时候先入右孩子,再入左孩子即可达到跟交换一样的效果)

   层次遍历:用到的是STL里面的queue。先入根节点,如果之前执行过交换,那么之后分别加入左孩子和右孩子,然后弹出根节点,直到队列为空,即遍历完所有节点。如果没执行交换,那么先加入右孩子,再左孩子。

     输出时注意行末不能留空格。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#define LL long long
using namespace std;
typedef struct tree{
struct tree* left;
struct tree* right;
int data;
}point;
int a[],b[],flag = ;
tree *creat(int preL,int preR,int inL,int inR){
if(preL > preR)return NULL;
tree *root = new tree;
root->data = a[preL];
int k;
for(k = inL;k <= inR ;k++){
if(b[k] == a[preL])break;
}
//找到中序遍历中跟先序遍历相同 数据的点,即利用中序遍历,分割左右子树,再递归分割
int numLeft = k - inL;
root->left = creat(preL+,preL+numLeft,inL,k-);
root->right = creat(preL+numLeft+,preR,k+,inR);
//递归构建左右子树
return root;
}
//由中序和先序遍历构树过程
void change(tree *root){
if(root==NULL)return;
tree *temp; temp = root->left;
root->left = root->right;
root->right = temp; //递归交换左右节点
change(root->left);
change(root->right);
}
void order(tree *root){
if(root==NULL)return;
queue<tree>q;
q.push(*root);
//队列模拟 层次遍历
while(!q.empty()){
tree que = q.front();//取队头
(flag == )?printf("%d",que.data):printf(" %d",que.data);
flag = ;
if(que.left!=NULL){
q.push(*(que.left));
}
if(que.right!=NULL){
q.push(*(que.right));
}
//先加入左结点,再加入右结点,直到队空即遍历完所有的结点,结束
q.pop();
}
}
int main(){
int n;
scanf("%d",&n);
for(int i = ; i < n ; i++)scanf("%d",&b[i]);
for(int i = ; i < n ; i++)scanf("%d",&a[i]);
tree *root = creat(,n-,,n-);
change(root);
order(root);
puts("");
}

TOJ 5225: 玩转二叉树的更多相关文章

  1. TZOJ 5225: 玩转二叉树

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

  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. pat 团体天梯赛 L2-011. 玩转二叉树

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

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

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

  6. 【PAT-二叉树】L2-011. 玩转二叉树- 仅仅开100大的数组模拟即可!

    L2-011. 玩转二叉树 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.(我的分析:无非就是说把左子树当成 ...

  7. ACM题目————玩转二叉树

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

  8. L2-011 玩转二叉树 (25 分) (树)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805065406070784 题目: 给定一棵二叉树的中序遍历和前序 ...

  9. PTA 天梯赛练习 7-11 玩转二叉树-二叉树重建

    以前就思考过这个问题,但是没有深入的想过,这是一种叫二叉树重建的典型题目 如果给出中序和前序,求出后序遍历. 这道题则求的是交换儿子节点的层序遍历. 二叉树的重建应该怎么重建,首先我们知道,先根遍历, ...

随机推荐

  1. HTML5 Canvas 小例子 简易画板

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. mysql查询一个表的字段,添加或修改到另外一个表的数据

    DELIMITER $$ USE `topsale`$$ DROP PROCEDURE IF EXISTS `sale_proce`$$ CREATE DEFINER=`root`@`%` PROCE ...

  3. Servlet基本_サーブレットのライフサイクル、スレッドセーフ

    1.サーブレットのライフサイクル初期化時 ⇒ init() [初回リクエスト時] ↓リクエスト時 ⇒service() ⇒doGet() [Httpリクエストメソッドにより振り分け] 或は⇒doPos ...

  4. python语言中的数据类型

    一.内存管理 1.python解释器的垃圾回收机制 垃圾:当一个值上没有人绑定任何变量名时(当引用计数为0),该值就是一个垃圾. python解释器运行时会检测值的引用计数,当引用计数=0该值会被清除 ...

  5. 多线程中的join总结笔记

    join方法的原理 就是调用相应线程的wait方法进行等待操作的,假如线程1中调用了线程2的join方法,则相当于在线程1中调用了线程2的wait方法,当线程2执行完(或者到达等待时间),线程2会自动 ...

  6. 【374】Adobe Acrobat 操作技巧

    1. 文件内容增减 参考:如何在PDF文件中删除页面 参考:如何旋转.移动.删除和重新编号 PDF 页面 双击PDF文档,并在预览程序中打开它. 如果在其他程序(如Adobe Reader)中打开文档 ...

  7. Linux awk命令使用方法

    awk是linux上非常好用的文本处理工具,常用于指定列的处理,包括获取指定列的内容.根据指定列匹配关系输出等文本处理.本文主要描述awk命令的基本语法.正则表达式与操作符的使用.常用内置变量的含义和 ...

  8. JavaScript 从定义到执行,你应该知道的那些事

    JavaScript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.执行环境.全局对象.变量对象.活动对象.作用域和作用域链等 ...

  9. OPENWRT路由3G拔号实验

    以下摘自:http://www.right.com.cn/forum/thread-155168-1-1.html 首先下载 Barrier Breaker 14.07 固件 配置好网络,可以访问到i ...

  10. 关于openwrt使用web升级提示固件版本不对的处理方法

    参考资料:https://blog.csdn.net/caoshunxin01/article/details/79355602 当openwrt使用web升级提示固件版本不对: The upload ...