1020 Tree Traversals——PAT甲级真题
1020 Tree Traversals
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.
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 postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print in one line the level order traversal sequence of the corresponding binary tree. 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:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7Sample Output:
4 1 6 3 5 7 2
题目大意:给你一颗二叉树的后序遍历序列和中序遍历序列。然后求出这颗二叉树的层次遍历序列。
大致思路:首先我们因该知道后序遍历序列的最后一个点为二叉树的根节点,在中序遍历序列中根节点左侧都为左子树,右侧都为右子树。所以我们要首先找到二叉树的根节点,然后在中序遍历中找到根节点所在的位置,然后对二叉树的左右子树递归的调用上述过程。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 35;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
int postorder[N], inorder[N]; //后序遍历数组,中序遍历数组
int preorder[N];
int n;
//由后续和中序遍历创建二叉树
TreeNode* buildTree(int postL, int postR, int inL, int inR) {
if (postL > postR)
return NULL; //设置递归返回条件,当postL ==
//postR时表明指向叶子节点,当postl > postR时,应当返回
TreeNode* node = new TreeNode(postorder[postR]);
//查找根节点在中序遍历中的位置
int k;
for (k = inL; k <= inR; k++) {
if (inorder[k] == postorder[postR]) break;
}
int numL = k - inL; //计算左子树结点的个数
//中序遍历中根节点左边的是左子树,右边的是右子树递归建树
node->left = buildTree(postL, postL + numL - 1, inL, k - 1);
node->right = buildTree(postL + numL, postR - 1, k + 1, inR);
return node;
}
//由前序和中序遍历创建二叉树
TreeNode* buildTree2(int preL, int preR, int inL, int inR) {
if (preL > preR) return nullptr;
TreeNode *node = new TreeNode(preorder[preL]);
int k;
for (k = inL; k <= inR; k++) {
if (inorder[k] == preorder[preL]) break;
}
int numL = k - inL;
node->left = buildTree2(preL + 1, preL + numL, inL, k - 1);
node->right = buildTree2(preL + numL + 1, preR, k + 1, inR);
return node;
}
//先序遍历
void inordervisit(TreeNode* root) {
if (root == nullptr) return;
cout << root->val << " ";
inordervisit(root->left);
inordervisit(root->right);
}
//层次遍历
void BFS(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
int cnt++;
while(!q.empty()) {
auto node = q.front(); q.pop();
cout << node->val;
cnt++;
if (cnt != n) cout << " ";
else cout << endl;
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &postorder[i]);
for (int i = 1; i <= n; i++) scanf("%d", &inorder[i]);
TreeNode* root = buildTree(1, n, 1, n);
BFS(root);
// inordervisit(root);
return 0;
}
1020 Tree Traversals——PAT甲级真题的更多相关文章
- PAT 甲级真题题解(1-62)
准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format 模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...
- PAT 甲级真题
1019. General Palindromic Number 题意:求数N在b进制下其序列是否为回文串,并输出其在b进制下的表示. 思路:模拟N在2进制下的表示求法,“除b倒取余”,之后判断是否回 ...
- 1086 Tree Traversals Again——PAT甲级真题
1086 Tree Traversals Again An inorder binary tree traversal can be implemented in a non-recursive wa ...
- PAT 甲级真题题解(63-120)
2019/4/3 1063 Set Similarity n个序列分别先放进集合里去重.在询问的时候,遍历A集合中每个数,判断下该数在B集合中是否存在,统计存在个数(分子),分母就是两个集合大小减去分 ...
- 1080 Graduate Admission——PAT甲级真题
1080 Graduate Admission--PAT甲级练习题 It is said that in 2013, there were about 100 graduate schools rea ...
- 1102 Invert a Binary Tree——PAT甲级真题
1102 Invert a Binary Tree The following is from Max Howell @twitter: Google: 90% of our engineers us ...
- PAT甲级真题及训练集
正好这个"水水"的C4来了 先把甲级刷完吧.(开玩笑-2017.3.26) 这是一套"伪题解". wacao 刚才登出账号测试一下代码链接,原来是看不到..有空 ...
- PAT 甲级真题题解(121-155)
1121 Damn Single 模拟 // 1121 Damn Single #include <map> #include <vector> #include <cs ...
- PAT甲级真题 A1025 PAT Ranking
题目概述:Programming Ability Test (PAT) is organized by the College of Computer Science and Technology o ...
随机推荐
- OpenStack (glance 镜像服务)
glance介绍 glance 提供云虚拟机上的服务镜像(Image)功能,该模块可看成车间里的模具生产部门,其功能包括虚拟机镜像的查找.注册和检索等.该模具最基本的使用方式就是在为云虚拟机实例提供安 ...
- docker启动脚本
#!/bin/bash # 定义环境变量 export LANG="en_US.UTF-8" #统一格式化打印输出信息 printMsg(){ echo "$(date ...
- pytest内核测试平台落地初体验
测试平台,有人说它鸡肋,有人说它有用,有人说它轮子,众说纷纭,不如从自身出发,考虑是否要做测试平台: 第1阶段,用Python+requests写接口自动化. 第2阶段,选择unitttest或pyt ...
- 最短路-SPFA算法&Floyd算法
SPFA算法 算法复杂度 SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环. SPFA一般情况复杂度是O(m)最坏情况下复杂度和朴素 ...
- NodeMCU使用ArduinoJson判断指定键值对存在与否
NodeMCU使用ArduinoJson判断指定键值对存在与否 从ArduinoJson库中可以得知,判断键值对是否存在可以使用containskey()函数,但是查看ArduinoJson-cont ...
- GPLT L2-007 家庭房产 (并查集)
题意: 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 思路: 输入和输出各构造一个结构体,利用并查集归并输入,枚举编号进行输出. #include &l ...
- codeforces 86D D. Powerful array
An array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary subarray al, a ...
- 洛谷-P1469 找筷子 (位运算)
题意:给你一组数,求数组中唯一的出现次数为奇数的那个数. 题解:这题其实直接桶排一下就行了,但是最后一个点会TLE. 后来了解到这题可以用位运算来解决: ^(异或)运算符:用于比较两个二进制数 ...
- linux搭建网站
CentOS 1.安装 yum -y install nginx *或者安装指定版本,版本网址:http://nginx.org/packages/centos/7/x86_64/RPMS/ rpm ...
- Cobalt Strike特征隐藏
前言 首先红蓝对抗的时候,如果未修改CS特征.容易被蓝队溯源. 前段时间360公布了cobalt strike stage uri的特征,并且紧接着nmap扫描插件也发布了.虽说这个特征很早就被发现了 ...