原题地址
注意这里左儿子下标为 2 * index+1,右儿子为2 * index+2
#include<iostream>
#include<map>
#include<vector>
using namespace std;
int N;
map<int,int> ans;//用vector存答案稍微麻烦点,我们直接用map存
vector<int> post,in;
void level(int root,int l,int r,int index)//root是当前树根节点,index是我们现在用到下标
{
if (l>r)return ;
int k;
for (k=l;k<r;k++) if (post[root]==in[k]) break;//在中序遍历中找到根节点
ans[index]=post[root];
level(root-1-r+k,l,k-1,2*index+1);//root-1-r+k是左子树根节点
level(root-1,k+1,r,2*index+2);//root-1是右子树根节点,这是根据后序遍历左右根原理
}
int main()
{
cin>>N;
post.resize(N);
in.resize(N);
for (int i=0;i<N;i++) cin>>post[i];
for (int i=0;i<N;i++) cin>>in[i];
level(N-1,0,N-1,0);
bool flag=false;
for (auto i:ans)
{
if (!flag) flag=true;
else cout<<" ";
cout<<i.second;
}
return 0;
}
附上另外一种输出ans的代码
bool flag=false;
for (int i=0;i<ans.size();i++)
{
if (ans[i])//因为不是每个下标index都被赋值,所以会出现一些是0,我们跳过这些输出
{
if (!flag) flag=true;
else cout<<" ";
cout<<ans[i];
}
}