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 7

Sample 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甲级真题的更多相关文章

  1. PAT 甲级真题题解(1-62)

    准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format  模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...

  2. PAT 甲级真题

    1019. General Palindromic Number 题意:求数N在b进制下其序列是否为回文串,并输出其在b进制下的表示. 思路:模拟N在2进制下的表示求法,“除b倒取余”,之后判断是否回 ...

  3. 1086 Tree Traversals Again——PAT甲级真题

    1086 Tree Traversals Again An inorder binary tree traversal can be implemented in a non-recursive wa ...

  4. PAT 甲级真题题解(63-120)

    2019/4/3 1063 Set Similarity n个序列分别先放进集合里去重.在询问的时候,遍历A集合中每个数,判断下该数在B集合中是否存在,统计存在个数(分子),分母就是两个集合大小减去分 ...

  5. 1080 Graduate Admission——PAT甲级真题

    1080 Graduate Admission--PAT甲级练习题 It is said that in 2013, there were about 100 graduate schools rea ...

  6. 1102 Invert a Binary Tree——PAT甲级真题

    1102 Invert a Binary Tree The following is from Max Howell @twitter: Google: 90% of our engineers us ...

  7. PAT甲级真题及训练集

    正好这个"水水"的C4来了 先把甲级刷完吧.(开玩笑-2017.3.26) 这是一套"伪题解". wacao 刚才登出账号测试一下代码链接,原来是看不到..有空 ...

  8. PAT 甲级真题题解(121-155)

    1121 Damn Single 模拟 // 1121 Damn Single #include <map> #include <vector> #include <cs ...

  9. PAT甲级真题 A1025 PAT Ranking

    题目概述:Programming Ability Test (PAT) is organized by the College of Computer Science and Technology o ...

随机推荐

  1. KVM (虚拟机创建及管理,存储管理)

    创建KVM虚拟机 1.图形化界面创建 第一步:查看软件包组 yum grouplist 第二步:下载GUI界面的软件包组 yum groupinstall "Server with GUI& ...

  2. java 石头剪子布游戏

    源代码 StoneGame.java 1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.I ...

  3. pythonchallenge总述

    Pythonchallenge是一个过关式的解谜站点,使用的是经典在线解谜站点Not Pr0n的模式:根据提示找出下一关的网页地址.和Not Pr0n不同的是,在每一关里你都需要编写程序来寻找答案.虽 ...

  4. D - LOL UVALive - 8521 (状压dp)

    https://nanti.jisuanke.com/t/A1616 思路:dp[i][j]表示前i列里面选了情况j有多少种组合方案 #include<bits/stdc++.h> usi ...

  5. Codeforces Round #628 (Div. 2) C. Ehab and Path-etic MEXs(树,思维题)

    题意: 给有 n 个点的树的 n-1 条边从 0 到 n-2 编号,使得任意两点路径中未出现的最小数最小的方案. 思路: 先给所有度为 1 的点所在边编号,之后其他点可以随意编排. #include ...

  6. Java 窗口 绘制图形 #3

    写在前面: 高数下学到第二章,突发奇想要写一个程序画二元函数图像 思路分了三层: ①抽象层: 因变量z,自变量x.y,坐标原点x0.y0.z0 ②投影实现层: 屏幕投影坐标px.py,x轴与屏幕水平方 ...

  7. Kubernetes部署Prometheus+Grafana(非存储持久化方式部署)

    1.在master节点处新建一个文件夹,用于保存下载prometheus+granfana的yaml文件 mkdir /root/prometheus cd /root/prometheus git ...

  8. (20002, b'DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (127.0.0.1:3306)\n')

    使用python 3.7 pymssql 连接本地mysql 5.6 报错 解决:参考 https://www.cnblogs.com/springbrotherhpu/p/11503139.html ...

  9. leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独

    leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...

  10. 使用 js 实现十大排序算法: 希尔排序

    使用 js 实现十大排序算法: 希尔排序 希尔排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!