三种建树方法

首先定义一下树的结点

struct node{
    int val;
    node* l;
    node* r;
};

前序中序序列建立二叉树:

//in[]和pre[]数组存放二叉树的中序和前序遍历序列
node* build(int preL,int preR,int inL,int inR){
    if(preL>preR)
        return NULL;
    node* root=(node*)malloc(sizeof(node));
    int val=pre[preL];
    root->val=val;
    int x;
    for(int i=inL;i<=inR;i++){
        if(in[i]==val){
            x=i;
            break;
        }
    }
    x=x-inL;
    root->l=build(preL+1,preL+x,inL,inL+x-1);
    root->r=build(preL+1+x,preR,inL+x+1,inR);
    return root;
}

 后序中序序列建立二叉树:

//in[]和post[]数组存放二叉树的中序和后序遍历序列
node* build(int postL,int postR,int inL,int inR){
    if(inL>inR)
        return NULL;
    node* root=(node*)malloc(sizeof(node));
    root->val=post[postR];
    int x;
    for(int i=inL;i<=inR;i++){
        if(in[i]==root->val){
            x=i;
            break;
        }
    }
    x=x-inL;    //x表示左子树结点的个数 
    root->l=build(postL,postL+x-1,inL,inL+x-1);
    root->r=build(postL+x,postR-1,inL+x+1,inR);
    return root;
}

 层序中序序列建立二叉树:

//in[]和level[]数组存放二叉树的中序和层序遍历序列
node* build(int levL,int levR,int inL,int inR){
    if(inL>inR)
        return NULL;
    int k,flag=0;
    while(levL<=levR){
        for(k=inL;k<=inR;k++){
            if(in[k]==level[levL]){
                flag=1;
                break;
            }
        }
        if(flag==1)
            break;
        levL++;
    }
    node* root=(node*)malloc(sizeof(node));
    root->val= in[k];
    k=k-inL;
    root->l=build(levL,levR,inL,inL+k-1);
    root->r=build(levL,levR,inL+k+1,inR);
    return root;    
}

 

posted @ 2020-07-12 15:46  9761滴  阅读(469)  评论(0编辑  收藏  举报