TOJ 5225: 玩转二叉树
传送门: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: 玩转二叉树的更多相关文章
- TZOJ 5225: 玩转二叉树
描述 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入 输入第一行给出 ...
- 团体程序设计天梯赛-练习集L2-011. 玩转二叉树
L2-011. 玩转二叉树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜 ...
- 团体程序设计天梯赛 L2-006. 树的遍历 L2-011. 玩转二叉树
L2-006. 树的遍历 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...
- pat 团体天梯赛 L2-011. 玩转二叉树
L2-011. 玩转二叉树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜 ...
- L2-011. 玩转二叉树(不建树)
L2-011. 玩转二叉树 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整 ...
- 【PAT-二叉树】L2-011. 玩转二叉树- 仅仅开100大的数组模拟即可!
L2-011. 玩转二叉树 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.(我的分析:无非就是说把左子树当成 ...
- ACM题目————玩转二叉树
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出 ...
- L2-011 玩转二叉树 (25 分) (树)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805065406070784 题目: 给定一棵二叉树的中序遍历和前序 ...
- PTA 天梯赛练习 7-11 玩转二叉树-二叉树重建
以前就思考过这个问题,但是没有深入的想过,这是一种叫二叉树重建的典型题目 如果给出中序和前序,求出后序遍历. 这道题则求的是交换儿子节点的层序遍历. 二叉树的重建应该怎么重建,首先我们知道,先根遍历, ...
随机推荐
- day05-表的三种关系
表的三种关系 1)一对一 关联方式:foreign key+unique例如1个学生只能有1个学号,1个学号只能对应1个学生 #两张表: 学生表(student)和 学号表(student_id) # ...
- [PHP]Nginx与PHP的文件上传大小限制
---------------------------------------------------------------------------------------------------- ...
- gitbash上使用tree
gitbash上使用tree vscode从cmd设置gitbash之后,想在使用windows下的tree命令发现运行不了,有两种解决方案. 1,在gitbash上cmd //c tree,就等同c ...
- Java基本语法知识要点
0x00 一个源文件中有多少个类,在用javac编译后,在同一目录下将产生多少个对应的字节码文件(.class ).类里面不一定要有public static void main(String[] ...
- delphi 域名转ip并判断ip是否可以联通
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- 简单全局HOOK拦截大部分键盘消息
前言:学习HOOK中,万一老师讲解HOOK入门教程:http://www.cnblogs.com/del/category/124150.html http://www.cnblogs.com/del ...
- Hibernate 再接触 ID生成策略
Xml 方法 在student.hbm.xml中 <generator class="uuid"></generator> 取值如下 1.identity: ...
- List of numerical libraries,Top Numerical Libraries For C#
Top Numerical Libraries For C# AlgLib (http://alglib.net) ALGLIB is a numerical analysis and data pr ...
- ArcGIS案例学习笔记3_1_地理配准案例_目视找点
ArcGIS案例学习笔记3_1_地理配准案例_目视找点 计划时间:第3天上午 方法:地理配准/添加链接点/左键/右键/输入坐标 数据:江苏省.zip 矢量:省界,市界,GPS WGS84 地理坐标系 ...
- python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...