- 针对该题主要就是考了对于中序遍历等三种遍历的熟悉程度,排序出来的分布规律,从上述图就可以看出一层的左子树和右子树的分布特点以及规律。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N = 40;
int n;
int posterder[N], inorder[N];
unordered_map<int, int> l, r, pos;//用了一个hash表方便后续的查找工作。pos的作用是记录中序遍历中
//的该值所在的数组下标编号
int q[N];//模拟一个队列,用于输出层序遍历
int build(int il, int ir, int pl, int pr)
{
int root = posterder[pr];
int k = pos[root];
if(il < k) l[root] = build(il, k - 1, pl, pl + (k - il - 1));//具体参数见上述手画图
if(k < pr) r[root] = build(k + 1, ir, pl + (k - 1 - il) + 1, pr);
return root;
}
void bfs(int root)//输出个层序遍历
{
int hh = 0, tt = 0;
q[0] = root;
while(hh <= tt)
{
int t = q[hh ++];
if(l.count(t)) q[ ++ tt ] = l[t];
if(r.count(t)) q[ ++ tt ] = r[t];
}
}
int main()
{
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> posterder[i];
for(int i = 0; i < n; i ++ )
{
cin >> inorder[i];
pos[inorder[i]] = i;
}
int root = build(0, n - 1, 0, n - 1);
bfs(root);
return 0;
}```