题目地址:
https://www.luogu.com.cn/problem/P1030
题目描述:
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数
≤
8
\le8
≤8)。
输入格式:
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式:
共一行一个字符串,表示一棵二叉树的先序。
思路是递归。后序遍历最后一个元素为树根,然后在中序遍历中找到树根,中序遍历树根左边即为左子树,右边即为右子树,接着递归求解即可。代码如下:
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
string mid, post;
unordered_map<char, int> mp;
void dfs(int ml, int mr, int pl, int pr) {
if (ml > mr) return;
putchar(post[pr]);
int root_idx = mp[post[pr]], lsz = root_idx - ml;
dfs(ml, root_idx - 1, pl, pl + lsz - 1);
dfs(root_idx + 1, mr, pl + lsz, pr - 1);
}
int main() {
cin >> mid;
cin >> post;
int n = mid.size();
for (int i = 0; i < n; i++) mp[mid[i]] = i;
dfs(0, n - 1, 0, n - 1);
puts("");
}
时空复杂度 O ( n ) O(n) O(n), n n n为树节点个数。