题目

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 lef to right and right to lef. 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

题目分析

已知中序序列和后序序列,打印锯齿形序列(奇数层正序,偶数层倒序)

解题思路

思路 01

  1. dfs建树(结点左右指针表示树)
  2. bfs遍历树,并设置每个节点分层保存
  3. 锯齿形打印

思路 02

  1. dfs建树(二维数组表示树,每个数组含两个元素:左孩子节点和右孩子节点)
  2. bfs遍历树,设置每个节点的层级,并分层保存
  3. 锯齿形打印

Code

Code 01

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn=30;
int n,pre[maxn],in[maxn],post[maxn];
struct node {
int data;
node * left;
node * right;
int depth;
};
vector<node*> result[30];
node * create(int inL,int inR,int postL,int postR) {
if(inL>inR)return NULL;
node * root = new node;
root->data=post[postR];
int k=inL;
while(k<inR&&in[k]!=post[postR])k++;
root->left=create(inL,k-1,postL,postR-(inR-k)-1);
root->right=create(k+1,inR,postR-(inR-k),postR-1);
return root;
}
void dfs(node * root) {
queue<node*> q;
root->depth=0;
q.push(root);
while(!q.empty()) {
node * now = q.front();
q.pop();
result[now->depth].push_back(now);
if(now->left!=NULL) {
now->left->depth=now->depth+1;
q.push(now->left);
}
if(now->right!=NULL) {
now->right->depth=now->depth+1;
q.push(now->right);
}
}
}
int main(int argc, char * argv[]) {
scanf("%d",&n);
for(int i=0; i<n; i++)scanf("%d",&in[i]);
for(int i=0; i<n; i++)scanf("%d",&post[i]);
node * root = create(0,n-1,0,n-1);
dfs(root);
printf("%d",result[0][0]->data);
for(int i=1;i<30;i++){
if(i%2==1){
for(int j=0;j<result[i].size();j++){
printf(" %d",result[i][j]->data);
}
}else{
for(int j=result[i].size()-1;j>=0;j--){
printf(" %d",result[i][j]->data);
}
}
}
return 0;
}

Code 02

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node {
int index;
int depth;
};
int n,tree[31][2],root;
vector<int> in,post,result[31];
void dfs(int &index, int inL, int inR, int postL, int postR) {
if(inL>inR)return;
index = postR; //当前root
//在中序序列中查找当前root
int k=inL;
while(k<inR&&in[k]!=post[postR])k++;
dfs(tree[index][0], inL, k-1, postL, postL+(k-inL)-1);
dfs(tree[index][1], k+1, inR, postL+(k-inL), postR-1);
}
void bfs() {
queue<node> q;
q.push(node {root,0});
while(!q.empty()) {
node temp = q.front();
q.pop();
result[temp.depth].push_back(post[temp.index]);
if(tree[temp.index][0]!=0)q.push(node{tree[temp.index][0],temp.depth+1});
if(tree[temp.index][1]!=0)q.push(node{tree[temp.index][1],temp.depth+1});
}
}
int main(int argc,char * argv[]) {
scanf("%d",&n);
in.resize(n+1),post.resize(n+1);
for(int i=1; i<=n; i++)scanf("%d",&in[i]);
for(int i=1; i<=n; i++)scanf("%d",&post[i]);
dfs(root,1,n,1,n);
bfs();
printf("%d",result[0][0]);
for(int i=1;i<31;i++){
if(i%2==1){
// 奇数行,正序
for(int j=0;j<result[i].size();j++){
printf(" %d",result[i][j]);
}
}else{
// 偶数行,逆序
for(int j=result[i].size()-1;j>=0;j--){
printf(" %d",result[i][j]);
}
}
}
return 0;
}

PAT Advanced 1127 ZigZagging on a Tree (30) [中序后序建树,层序遍历]的更多相关文章

  1. PAT甲级 1127. ZigZagging on a Tree (30)

    1127. ZigZagging on a Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  2. pat 甲级 1127. ZigZagging on a Tree (30)

    1127. ZigZagging on a Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  3. PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树

    根据中序遍历和前序遍历确定一棵二叉树,然后按“层次遍历”序列输出.输出规则:除根节点外,接下来每层的节点输出顺序是:先从左到右,再从右到左,交替输出 #include <iostream> ...

  4. PAT甲级1127. ZigZagging on a Tree

    PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...

  5. PAT Advanced 1064 Complete Binary Search Tree (30) [⼆叉查找树BST]

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  6. PAT 甲级 1127 ZigZagging on a Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805349394006016 Suppose that all the k ...

  7. 1127 ZigZagging on a Tree (30 分)

    1127 ZigZagging on a Tree (30 分) Suppose that all the keys in a binary tree are distinct positive in ...

  8. 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 ...

  9. PAT 1127 ZigZagging on a Tree

    Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...

随机推荐

  1. 实验吧-密码学-这里没有key(VBScript脚本加密)

    打开网页,查看源代码,发现一段乱码,这就是加密后的密文. #@~^TgAAAA=='[6*liLa6++p'aXvfiLaa6i[[avWi[[a*p[[6*!I'[6cp'aXvXILa6fp[:6 ...

  2. 一、REACT概述

    1.前端/react概述 <从零react> 1.前端工 程概述 Web跨平台.跨浏览 器的应用开发场景 网页浏览器(Web Browser) 通过 CLI 指令去操作的 Headless ...

  3. Spring 面向切面编程(AOP)

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  4. Ubantu学习笔记2

    又是新的一天,继续学习Ubantu命令 cat 可以查看文件内容 cat -n p.py 可以在查看文件内容的同时显示行号 cat -s p.py 可以将多行空白的地方进行合并成一行(输入空格的地方不 ...

  5. BZOJ 4029 [HEOI2015]定价

    题解: !!!!!! 分类讨论,情况挺多 #include<iostream> #include<cstdio> #include<cstring> using n ...

  6. BZOJ:2244: [SDOI2011]拦截导弹

    问题: printf("%.5f ",0):为什么错了? 注意: 初始值很重要 题解: 三维偏序问题: 记录从前往后最长上升子序列长度pref,条数preg 从后往前suff,su ...

  7. comparable接口 和 comparator接口的特点与区别

    1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的. 什么是自定义class: 如 public class Pe ...

  8. VLOOKUP返回#N/A结果

    VLOOKUP返回#N/A结果 1.无目标值 使用control+f查找是否存在所要搜索的值. 2.位置错误 所要搜索区域,被搜索值必须在首列. 3.格式错误 搜索值和被搜索区域格式需一致. 4.特殊 ...

  9. python脚本下载 Google Driver 文件

    使用python脚本下载 Google Driver 文件 import yaml import sys import requests import os import re import tarf ...

  10. Mybatis实现增删改查(二)

    1. 准备 请先完成Mybatis基本配置(一)的基本内容 2. 查询多条商品信息 1)在com.mybatis.dao.PartDao中增加接口函数 public List<PartInfo& ...