1.已知两个序链表建树

先序中序建树

PAT 1086

node *buildTree(vector<int>pre,vector<int>in,int pl,int pr,int il,int ir){
    if(pl>pr || il>ir) return NULL;
    int pos=-1;
    for(int i=il;i<=ir;i++){
        if(in.at(i)==pre.at(pl)){
            pos=i;
            break;
        }
    }
    node *root=new node();
    //root->left=root->right=NULL;
    root->data=pre.at(pl);
    root->left=buildTree(pre,in,pl+1,pl+pos-il,il,pos-1);
    root->right=buildTree(pre,in,pl+pos-il+1,pr,pos+1,ir);
    return root;
}

后序中序建树

PAT 1020

node *build(int pl,int pr,int il,int ir){
    if(pl>pr || il>ir) return NULL;
    int pos=-1;
    for(int i=il;i<=ir;i++){
        if(in[i]==post[pr]){
            pos=i;
            break;
        }
    }
    node *root=new node();
    root->data=post[pr];
    root->right=build(pr-(ir-pos),pr-1,pos+1,ir);//是ir-pos
    root->left=build(pl,pr-(ir-pos)-1,il,pos-1);
    return root;
}
12-21 23:04