pat 1127. ZigZagging on a Tree
来源:互联网 发布:贵州大数据平台 编辑:程序博客网 时间:2024/06/05 10:37
原题链接:https://www.patest.cn/contests/pat-a-practise/1127
1127. 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:812 11 20 17 1 15 8 512 20 17 11 15 8 5 1Sample Output:
1 11 5 8 17 12 20 15
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <map>#include <vector>#include <set>#include <string>#include <queue>#include <stack>using namespace std;struct node{ int num; node *lc,*rc; int step; node() {} node(int num, node *lc, node *rc,int step):num(num), lc(lc), rc(rc), step(step) {}};int a[35],b[35];vector<int> vt[35];int n;void build(int pos,int l,int r,node *&rt){ int i,tmp=-1; for(i=l; i<=r; i++)//注意每次在l~r区间内搜,而不是在1~n区间内搜 { if(a[i]==b[pos]) { tmp=i; break; } } if(tmp==-1)//必须保证pos没有超过l~r的范围,,如果没有搜到,就是超过了(也可以直接判断if(l>r)) return ; //rt=(struct node *)malloc(sizeof(struct node)); //rt->num=b[pos]; //rt->lc=NULL; //rt->rc=NULL; rt=new node(b[pos],NULL,NULL,0); if(tmp>l) build(pos-(r-tmp)-1,l,tmp-1,rt->lc);//注意每次的pos是后序遍历(前序遍历)的根节点位置,,是辅助中序序列找根节点位置的(找左右子树根节点位置时,都要在l~r区间的基础上找) if(tmp<r) build(pos-1,tmp+1,r,rt->rc);}void bfs(node *rt)//因为每一层的输出顺序都不一样,所以每一层都要单独存,然后单独输出,用vector{ int i,j; int mmax=-1; node *s; queue<node*> q; rt->step=0; q.push(rt); while(!q.empty()) { s=q.front(); q.pop(); vt[s->step].push_back(s->num); mmax=max(mmax,s->step); if(s->lc!=NULL) { s->lc->step=s->step+1; q.push(s->lc); } if(s->rc!=NULL) { s->rc->step=s->step+1; q.push(s->rc); } } printf("%d",vt[0][0]); for(i=1; i<=mmax; i++) { if(i&1) { for(j=0; j<(int)vt[i].size(); j++) printf(" %d",vt[i][j]); } else { for(j=vt[i].size()-1; j>=0; j--) printf(" %d",vt[i][j]); } } printf("\n"); return ;}int main(){ int i; node *T; scanf("%d",&n); for(i=1; i<=n; i++) scanf("%d",&a[i]); for(i=1; i<=n; i++) scanf("%d",&b[i]); build(n,1,n,T); bfs(T); return 0;}
- PAT 1127. ZigZagging on a Tree (30)
- PAT--1127. ZigZagging on a Tree
- PAT-1127. ZigZagging on a Tree (30)
- pat 1127. ZigZagging on a Tree
- pat 1127. ZigZagging on a Tree (30) 递归建树 + BFS
- PAT 1127. ZigZagging on a Tree (30)-甲级
- PAT (Advanced Level) 1127. ZigZagging on a Tree (30)
- 1127. ZigZagging on a Tree (30) PAT 甲级
- PAT甲级 1127. ZigZagging on a Tree (30)
- 【PAT】【Advanced Level】1127. ZigZagging on a Tree (30)
- PAT 甲级 1127. ZigZagging on a Tree (30)
- PAT--ZigZagging on a Tree (30)
- PAT A1127. ZigZagging on a Tree (30)
- PAT A1127 ZigZagging on a Tree
- 1127. ZigZagging on a Tree (30)
- 1127.ZigZagging on a Tree (30)
- 1127. ZigZagging on a Tree (30)
- 1127. ZigZagging on a Tree (30)
- python logging 日志配置
- Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介
- 并查集详解
- 快递100 物流接口对接
- 26:滑雪
- pat 1127. ZigZagging on a Tree
- unity的monoBebavior 函数时序
- 紫光为什么看重LATTICE的FPGA
- loadrunner第一次实践
- 第六章
- Android自定义控件-彩色进度条
- 287. Find the Duplicate Number
- html导航框架简析
- AngularJS 监听变量变化