原题位置
这道题基本上与这道题一样,详细解析可以点进去看看。
唯一不同在于下标的运用,由于要镜像,左右儿子要实现对调,那我们只需在使用下标时,左右儿子下标反着用就行,即左儿子用2 * index+2,右儿子用2 * index+1
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int N;
vector<int> pre,in;
map<int,int> ans;
void level(int root,int l,int r,int index)
{
if (l>r) return ;
int k=l;
for (k=l;k<=r;k++) if (pre[root]==in[k]) break;
ans[index]=pre[root];
level(root+1,l,k-1,2*index+2);
level(root+1+k-l,k+1,r,2*index+1);
}
int main()
{
cin.tie(0);
cin>>N;
pre.resize(N),in.resize(N);
for (int i=0;i<N;i++) cin>>in[i];
for (int i=0;i<N;i++) cin>>pre[i];
level(0,0,N-1,0);
bool flag=false;
for (auto i:ans)
{
if (!flag) flag=true;
else cout<<" ";
cout<<i.second;
}
return 0;
}
另外一种输出代码
for (int i=0;i<ans.size();i++)
{
if (ans[i]) {
if (!flag) flag=true;
else cout<<" ";
cout<<ans[i];
}
}