PAT A1127 ZigZagging on a Tree (30 分)
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to print the numbers in level-order. However, if you think the problem is too simple, then you are too naive. This time you are supposed to print the numbers in "zigzagging order" -- that is, starting from the root, print the numbers level-by-level, alternating between left to right and right to left. For example, for the following tree you must output: 1 11 5 8 17 12 20 15.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the inorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the zigzagging sequence of the tree in a line. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:
8
12 11 20 17 1 15 8 5
12 20 17 11 15 8 5 1
Sample Output:
1 11 5 8 17 12 20 15
result:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = ;
int n,postOrder[maxn],inOrder[maxn];
vector<vector<int> > ans(maxn);
int level1=; void createTree(int inL,int inR,int postL,int postR,int level2){
if(postR<postL || inR<inL) return ;
int data = postOrder[postR];
ans[level2].push_back(data);
// printf("%d ",data);
level1 = max(level1,level2);
int num=;
while(inOrder[inL+num] != postOrder[postR]){
num++;
}
// 这样生成的num指的是有num个lchild;
createTree(inL,inL+num-,postL,postL +num-,level2+);
createTree(inL+num+,inR,postL +num,postR - ,level2+);
return ;
} int main(){
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&inOrder[i]);
}
for(int i=;i<n;i++){
scanf("%d",&postOrder[i]);
}
createTree(,n-,,n-,);
int s = ;
bool flag = false;
for(vector<vector<int> >::iterator i=ans.begin();i!=ans.end();++i){
if(flag){
for(vector<int>::iterator j=(*i).begin();j !=(*i).end();++j){
printf("%d",(*j));
s++;
if(s<n) printf(" ");
}
flag=false;
}else{
reverse((*i).begin(),(*i).end());
for(vector<int>::iterator j=(*i).begin(); j !=(*i).end();++j){
printf("%d",(*j));
s++;
if(s<n) printf(" ");
}
flag=true;
}
}
}
收获:
此题主要的问题是如何生成蛇形层次排序法。首先想到的存储结构是按照二维数组ans[level][]保存结果。
如果以int ans[][]定义的话需要面对阈值问题,以及设计计数器问题。看题目里是没有阈值限制的,所以还需要自己设置。对于考试来说,也是可以实现的。
另外一种方式是利用vector<int>;在此题我首次体验了一下二维的vector<vector<int> >; 需要注意的是,普通二维数组需要确定第二维度的阈值;而在vector中,需要声明第一维度的阈值。而且设置阈值的方式是用小括号,而非数组形式的中括号。
对于vector<>进行迭代有两种方法,一种是用下标进行访问。使用下标访问需要结合vector<>的生成方式配合使用。一般是int i =0;i< vector.size();i++的方式;但是对于比较妖怪的存储方法,或者间断的存储方式,下标访问不是很方便。
一种是用迭代器访问,如上代码,清晰的给出了二维向量的访问方法。这里需要注意的是对于vector<>,弄清楚 front,back,begin,end四个方法的具体区别。简单说front,back可以直接引用首尾向量;begin,end返回的是vector<>首尾的迭代器。其中begin和front效果一致,但end指的是空迭代器;这也是为何遍历的时候结束条件是i!=vector.end();
使用迭代器还需要掌握一点是逆序遍历迭代器。逆序遍历有两种方法可以实现。
1)利用algorithm::reverse(a,b)先互换begin(),end();其他完全不变的方式实现。(如上代码);
同样的方法也可以换个写法:
// sorts vector in "normal" order
sort(vector.begin(), vector.end());
// sorts in reverse: puts smallest element at the end of vector
sort(vector.rbegin(), vector.rend());
这是利用了vector<>自身方法的解决方案,下图是begin(),end(),rend(),rbegin()四者的关系。

2)生成反向迭代器
for(vector<int>::reverse_iterator j=(*i).rbegin(); j !=(*i).rend();++j){
printf("%d",(*j));
s++;
if(s<n) printf(" ");
}
PAT A1127 ZigZagging on a Tree (30 分)的更多相关文章
- PAT A1127 ZigZagging on a Tree (30 分)——二叉树,建树,层序遍历
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...
- PAT甲级:1064 Complete Binary Search Tree (30分)
PAT甲级:1064 Complete Binary Search Tree (30分) 题干 A Binary Search Tree (BST) is recursively defined as ...
- PAT甲级 1127. ZigZagging on a Tree (30)
1127. ZigZagging on a Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- pat 甲级 1127. ZigZagging on a Tree (30)
1127. ZigZagging on a Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- PAT 甲级 1064 Complete Binary Search Tree (30 分)(不会做,重点复习,模拟中序遍历)
1064 Complete Binary Search Tree (30 分) A Binary Search Tree (BST) is recursively defined as a bin ...
- PTA 04-树6 Complete Binary Search Tree (30分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/669 5-7 Complete Binary Search Tree (30分) A ...
- PAT-2019年冬季考试-甲级 7-4 Cartesian Tree (30分)(最小堆的中序遍历求层序遍历,递归建树bfs层序)
7-4 Cartesian Tree (30分) A Cartesian tree is a binary tree constructed from a sequence of distinct ...
- PAT 1127 ZigZagging on a Tree[难]
1127 ZigZagging on a Tree (30 分) Suppose that all the keys in a binary tree are distinct positive in ...
- [PAT] 1143 Lowest Common Ancestor(30 分)
1143 Lowest Common Ancestor(30 分)The lowest common ancestor (LCA) of two nodes U and V in a tree is ...
随机推荐
- lvm 相关
求教:/home分区和/root分区的关系 lvm扩容试验 [复制链接] lvm快速使用http://imysql.cn/2008_05_05_quick_startup_lvm Linux LVM学 ...
- linux 用户切换 标签: linux 2016-07-30 13:57 144人阅读 评论(0) 收藏
一.指令修改 1.普通用户切换到root用户: su root 需要输入密码 2.root用户切换到普通用户: su 用户名 不需要输入密码 二.直接注销,再用新用户登录 注:1.两种方式存在差别,用 ...
- 学习Road map Part 01 数学
方法: 结合编程软件 matlab / octave / python / maxima / ruby 线性代数 向量.行列式 线性方程组 LU 分解 特征值.对角化 特征值算法
- delegate 和 event
delegate 和 event 观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, ...
- 洛谷 P4593 【[TJOI2018]教科书般的亵渎】
题目分析 一眼看上去就像是一个模拟题目,但是\(n\)的范围过大. 冷静分析一下发现难点在于如何快速求出幂和. 考虑使用伯努利数. \(B_0=1\) \(B_n=-\frac{1}{n+1}\sum ...
- FBKVOController代码阅读
功能:对kvo机制进行封装,简化使用,简化内存管理: 要素:观察者.被观察者.处理函数. 模式:注册表模式: 机制:对象创建.注册管理.内存管理.处理机制转换: 其它:注册去重: kvo的管理机制:
- python中__init__.py与def __init__(self)的使用
一直对__init__的使用很迷茫,这里系统的学习了解下 1.__init__.py文件-package的标识 python中每个package实际上是一个目录(Directory),程序运行时如何识 ...
- 使用腾讯云mysql的一下小坑
1. 数据库中标的命名,mybatis会给你全部转成驼峰命名,这样就会发现找不到数据库的表了.比如下面的,我在本地运行时ok, 表名称是t_blogtype,但是放到服务器就报错说找不到表. 2. 本 ...
- java之sleep(),join(),yield(),wait(),notify()、notifyAll()区别
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...
- 【Nginx】使用Nginx作为Http代理的配置文件
请看配置文件中的注释~ #user nobody; worker_processes 1; #pid logs/nginx.pid; events { worker_connections 1024; ...