#include <iostream>
#include <cstring>
#include <unordered_map>
using namespace std;
const int N = 35;
int n;
int postorder[N], inorder[N];
unordered_map<int, int>pos, l, r;
int q[N];
int build(int il, int ir, int pl, int pr)
{
int root = postorder[pr];
int k = pos[root];//将k定位到中序遍历的根节点
if (il < k)//如果左子树存在
l[root] = build(il, k - 1, pl, pl + k - 1 - il);
if (ir > k)//如果右子树存在
r[root] = build(k + 1, ir, pl + k - il, pr - 1);
return root;
}
void bfs(int root)
{
int hh = 1, tt = 1;
q[1] = root;
while (hh <= tt)//while队列不空
{
int t = q[hh++];//取出队头元素
if (l.count(t))//若左孩子存在,左孩子入队
q[++tt] = l[t];
if (r.count(t))//若右孩子存在,右孩子入队
q[++tt] = r[t];
}
cout << q[1];
for (int i = 2; i <= n; i++)
cout << ' ' << q[i];
cout << endl;
}
int main()
{
cin >> n;
getchar();
for (int i = 1; i <= n; i++)
cin >> postorder[i];
for (int i = 1; i <= n; i++)
{
cin >> inorder[i];
pos[inorder[i]] = i;//快速按值查找中序遍历元素位置
}
int root = build(1,n,1,n);
bfs(root);
return 0;
}
求中序遍历
最新推荐文章于 2024-10-13 21:35:06 发布