传送门: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("");
}

最新文章

  1. C++ 标准库string字符串的截取
  2. jira与mysql的配合搭建调整
  3. BZOJ1114 : [POI2008]鲁滨逊逃生Rob
  4. [Cocos2d-x For WP8]Layer 层
  5. 关于transition回调函数的几种写法
  6. LINUX下查看负载
  7. MySQL(22):事务管理之 事务回滚
  8. WCF 之 DataContract
  9. COB Epoxy灌膠時氣泡產生的原因與解決方法
  10. 关于cocos2d安装时编译不成功(个人心得)
  11. js正则:零宽断言
  12. VMWare 11安装操作系统 - 初学者系列 - 学习者系列文章
  13. printf code
  14. windows下常用软件
  15. 用sqlyog迁移mysql数据库
  16. C# 移动无标题栏窗体的几种方法
  17. 201521123008《Java程序设计》第二周实验总结
  18. spring boot 使用java9上传到github其他人clone后报错
  19. idea如何快速查看接口的实现类
  20. Automatically migrating data to new machines kafka集群扩充迁移topic

热门文章

  1. SqlDataSource.FilterExpression Property
  2. leetcode149
  3. 如何创建一个django工程与和mysql打通
  4. 20165304《JAVA程序设计》第四周学习总结
  5. Linux下使用命令行配置IPMI
  6. KVM虚拟化技术(六)磁盘管理
  7. WEB前端问题——img标签的onclick事件无法响应问题【转载】
  8. HTML+CSS基础课程二
  9. 关于三层(dao,serviece,servlet)
  10. 用工厂模式和策略模式优化过多的if-else