热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PAT1127.ZigZaggingonaTree(30)甲级

Supposethatallthekeysinabinarytreearedistinctpositiveintegers.Auniquebinar

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 (<&#61; 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

题目大意&#xff1a;给出一个树的中序和后序遍历结果&#xff0c;求它的Z字型层序遍历&#xff0c;也就是偶数层从右往左&#xff0c;奇数层从左往右遍历&#xff5e;
分析&#xff1a;分为3步&#xff1a;1.根据中序和后序建树 保存在tree二维数组中&#xff0c;比如&#xff1a;tree[i][0] &#61; val表示post[i]的左孩子是post[val]&#xff0c;tree[i][1] &#61; val表示post[i]的右孩子是post[val]&#xff5e;
2.进行广度优先搜索&#xff0c;将树从根结点开始所有结点层序遍历&#xff0c;保存在result二维数组中&#xff0c;比如&#xff1a;result[i]保存第i层所有结点的序列&#xff5e;
3.进行z字型输出&#xff0c;根据当前层号的奇偶性分别从左往右、从右往左遍历输出&#xff5e;

1. dfs&#xff1a;因为post(后序)是按照左、右、根的顺序遍历的&#xff0c;所以从右往左&#xff0c;最右边的肯定是根结点&#xff5e;所以postRight是当前子树的根结点的下标&#xff0c;将它的赋值给index&#xff0c;并继续dfs tree[index][0]和tree[index][1]&#xff5e;
根据post[postRight]的结点在in里面的下标位置i&#xff0c;可以得到i的左边是左子树&#xff0c;即inLeft 到 i - 1&#xff0c;右边是右子树&#xff1a;i &#43; 1 到 inRight。而对于post来说&#xff0c;根据左子树的结点个数i - inLeft可以得到[postLeft, postLeft &#43; (i - inLeft) - 1]是post中左子树的范围&#xff0c;[postLeft &#43; (i - inLeft), postRight - 1]是post中右子树的范围&#xff5e;
2.广度优先搜索&#xff0c;采用队列q&#xff0c;q中保存的是node结点&#xff0c;node.index表示当前节点在post中的下标&#xff0c;node.depth表示当前结点在树中的层数&#xff5e;

3.当 i % 2 &#61;&#61; 0的时候倒序输出&#xff0c;否则正序输出&#xff5e;

#include
#include
#include
using namespace std;
vector in, post, result[35];
int n, tree[35][2], root;
struct node {
int index, depth;
};
void dfs(int &index, int inLeft, int inRight, int postLeft, int postRight) {
if (inLeft > inRight) return;
index &#61; postRight;
int i &#61; 0;
while (in[i] !&#61; post[postRight]) i&#43;&#43;;
dfs(tree[index][0], inLeft, i - 1, postLeft, postLeft &#43; (i - inLeft) - 1);
dfs(tree[index][1], i &#43; 1, inRight, postLeft &#43; (i - inLeft), postRight - 1);
}
void bfs() {
queue q;
q.push(node{root, 0});
while (!q.empty()) {
node temp &#61; q.front();
q.pop();
result[temp.depth].push_back(post[temp.index]);
if (tree[temp.index][0] !&#61; 0)
q.push(node{tree[temp.index][0], temp.depth &#43; 1});
if (tree[temp.index][1] !&#61; 0)
q.push(node{tree[temp.index][1], temp.depth &#43; 1});
}
}
int main() {
cin >> n;
in.resize(n &#43; 1), post.resize(n &#43; 1);
for (int i &#61; 1; i <&#61; n; i&#43;&#43;) cin >> in[i];
for (int i &#61; 1; i <&#61; n; i&#43;&#43;) cin >> post[i];
dfs(root, 1, n, 1, n);
bfs();
printf("%d", result[0][0]);
for (int i &#61; 1; i <35; i&#43;&#43;) {
if (i % 2 &#61;&#61; 1) {
for (int j &#61; 0; j printf(" %d", result[i][j]);
} else {
for (int j &#61; result[i].size() - 1; j >&#61; 0; j--)
printf(" %d", result[i][j]);
}
}
return 0;
}







推荐阅读
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 洛谷 P4035 [JSOI2008] 球形空间生成器(高斯消元法 / 模拟退火算法)
    本文介绍了洛谷 P4035 [JSOI2008] 球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于 ACM 竞赛和其他相关应用场景。数据范围限制在 10 以内,确保了算法的高效性和准确性。 ... [详细]
  • 本文深入探讨了佩尔方程 \( x^2 - dy^2 = 1 \) 的递推关系式。通过构造特定的矩阵并利用矩阵快速幂的方法,可以高效地计算出该方程的第 k 组解。此外,文章还详细分析了递推关系式的数学背景及其在数论中的应用,为相关研究提供了坚实的理论基础。 ... [详细]
  • 数据库多表联合查询:内连接与外连接详解
    在数据库的多表查询中,内连接和外连接是两种常用的技术手段。内连接用于检索多个表中相互匹配的记录,即只有当两个表中的记录满足特定的连接条件时,这些记录才会被包含在查询结果中。相比之下,外连接则不仅返回匹配的记录,还可以选择性地返回不匹配的记录,具体取决于左外连接、右外连接或全外连接的选择。本文将详细解析这两种连接方式的使用场景及其语法结构,帮助读者更好地理解和应用多表查询技术。 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • 本报告对2018年湘潭大学程序设计竞赛在牛客网上的时间数据进行了详细分析。通过统计参赛者在各个时间段的活跃情况,揭示了比赛期间的编程频率和时间分布特点。此外,报告还探讨了选手在准备过程中面临的挑战,如保持编程手感、学习逆向工程和PWN技术,以及熟悉Linux环境等。这些发现为未来的竞赛组织和培训提供了 valuable 的参考。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
author-avatar
Dfsk刘海_368
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有