【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;
	}
}
posted @ 2021-02-03 17:54  Hyx'  阅读(54)  评论(0)    收藏  举报