【1020 25 中后序转层序】 Tree Traversals
传送门
题意
给定 \(n\) 表示共有 \(n\) 个节点,然后给定后序遍历序列,中序遍历序列,求层序遍历序列
数据范围
\(1\leq n\leq 30\)
题解
- 后序最后一个节点是当前树的根
- 中序中找到根结点的位置,分割开来的左右子序列就是左右子树的大小,根据这个进行递归即可
- 左子树中后序的最后一个元素下标为
post_r - (in_r - mid) = 1 - 右子树根的下标为
post_r - 1
- \(dfs\) 过程用 \(u\) 记录当前节点在堆存储中的标志,每次递归的时候根据递归的是左右左右进行堆下标的计算即可
- 非满二叉树等于将有节点的堆存储下标节点排序后的结果
Code
#include <bits/stdc++.h>
using namespace std;
vector<int> post, in;
map<int, int> level;
void dfs(int post_r, int in_l, int in_r, int u) {
if (in_l > in_r) return;
int root = in_l;
while (root < in_r and in[root] != post[post_r]) root++;
level[u] = in[root];
dfs(post_r - (in_r - root) - 1, in_l, root - 1, u * 2);
dfs(post_r - 1, root + 1, in_r, u * 2 + 1);
}
int main() {
int n; cin >> n;
post.resize(n); in.resize(n);
for (auto& it : post) cin >> it;
for (auto& it : in) cin >> it;
dfs(n - 1, 0, n - 1, 1);
bool out = 0;
for (auto& it : level) {
if (out) cout << ' ';
cout << it.second;
out = 1;
}
}

浙公网安备 33010602011771号