#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int N = 35;
int a[N],b[N]; //后序遍历和中序遍历
int p[N];
int l[N],r[N];
int n;
int build(int al,int ar,int bl,int br,int d) //建立树
{
if(al > ar) return 0;
int val = a[ar]; //后序遍历的最后一个元素为根
int k = p[val]; //记录根在中序遍历中的位置
l[val] = build(al,al + k - 1 - bl,bl,k - 1,d + 1); //递归建立左子树
r[val] = build(al + k - bl,ar - 1,k + 1,br,d + 1); //递归建立右子树
return val; //返回根节点
}
void bfs() //bfs模板
{
queue<int> q;
q.push(a[n]); //将根节点入队
while(q.size())
{
int t = q.front();
q.pop();
cout << t << ' ';
if(l[t]) q.push(l[t]); //如果左子树存在
if(r[t]) q.push(r[t]);
}
}
int main()
{
cin >> n;
for(int i = 1;i <= n;i ++) cin >> a[i];
for(int i = 1;i <= n;i ++) cin >> b[i];
for(int i = 1;i <= n;i ++) p[b[i]] = i; //记录中序遍历的每个点的位置
build(1,n,1,n,1);
bfs();
return 0;
}
注意点:
build返回根节点,才能达到递归的作用。
l[val] = build(al,al + k - 1 - bl,bl,k - 1,d + 1); //递归建立左子树
r[val] = build(al + k - bl,ar - 1,k + 1,br,d + 1); //递归建立右子树
2.记录的是中序遍历每个节点的位置。