先序 中序建立二叉树!!!
真不错 终于写出来了
#include<iostream>
#include<map>
using namespace std;
const int N=20010;
int preorder[N],inorder[N],w[N],n,ans[N];
map<int,int> ha_sh;
struct node
{
int num;
node* left;
node* right;
node(int x){num=x,left=nullptr,right=nullptr;}
};
node* dfs(int pl,int pr,int il,int ir)
{
if(pl>pr)return nullptr;
auto root=new node(preorder[pl]);
int k=ha_sh[root->num];
auto lson=dfs(pl+1,pl+k-il,il,k-1);
auto rson=dfs(pl+k-il+1,pr,k+1,ir);
root->left=lson;
root->right=rson;
return root;
}
node* Build_Tree()
{
for(int i=1;i<=n;i++)ha_sh[inorder[i]]=i;
return dfs(1,n,1,n);
}
void dfs(node* root,int val)
{
if(root==nullptr)return;
int kk=val+w[root->num];
ans[root->num]=kk;
dfs(root->left,kk);
dfs(root->right,kk);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&preorder[i]);
for(int i=1;i<=n;i++)scanf("%d",&inorder[i]);
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
auto root=Build_Tree();
dfs(root,0);
printf("%d",ans[1]);
for(int i=2;i<=n;i++)printf(" %d",ans[i]);
cout<<endl;
}