使用前序和中序序列建树
用size()去substr,避免out_of_range

#include<iostream>
#include<string>

using namespace std;

struct TreeNode {
    char data;
    TreeNode *lchild=NULL,*rchild=NULL;
};

void BuildTree(TreeNode *root,string pre,string mid){
    root->data = pre[0];
    if(mid.size()==1) return;
    
    int pos = mid.find(pre[0]);
    string mid_left = mid.substr(0,pos);
    string mid_right = mid.substr(pos+1);
    string pre_left = pre.substr(1,mid_left.size());
    string pre_right = pre.substr(mid_left.size()+1);
    
    
    if(mid_left.size()>0){
        root->lchild = new TreeNode();
        BuildTree(root->lchild,pre_left,mid_left);
    }
    if(mid_right.size()>0){
        root->rchild = new TreeNode();
        BuildTree(root->rchild,pre_right,mid_right);
    }
}
void PostOrder(TreeNode* root){
    if(root==NULL) return;
    
    if(root->lchild!=NULL) PostOrder(root->lchild);
    if(root->rchild!=NULL) PostOrder(root->rchild);
    
    cout<<root->data;
}

int main(){
    string pre,mid;
    while(cin>>pre>>mid){
        TreeNode* root = new TreeNode();
        BuildTree(root,pre,mid);
        PostOrder(root);
        cout<<endl;
    }
    
    
    return 0;
}