2020-08-10

根据前序序列和中序序列构建二叉树

#include<bits/stdc++.h>
using namespace std;
int n;
typedef struct node{
    int val;
    struct node* left;
    struct node* right;
}*Bitree;

/*
如果q1数组为1 2 3 4 5
int* q2=q1+2;
则q2数组为3 4 5

*/
Bitree createBitree(int* q,int* z,int size){//size为中序长度,当size<1时说明该结点为空//
    if(size<1)return NULL;
    Bitree p=(Bitree)malloc(sizeof(struct node));
    p->val=q[0];//每次前序的第一个为结点//
    int f=0;//f来计算左子树的结点数//
    while(z[f]!=p->val)f++;//计算左子树结点数//
    int r=size-f-1;//当前中序长度减去左子树长度再减去根节点为右结点数//
    p->left=createBitree(q+1,z,f);//创建左子树,
    p->right=createBitree(q+f+1,z+f+1,r);//创建右子树
    return p;
}

void hdisplay(Bitree t){
    if(t==NULL)return ;
    else{
        hdisplay(t->left);
        hdisplay(t->right);
        cout<<t->val<<' ';
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    int q[100];
    int z[100];
    for(int i=0;i<n;i++){
        cin>>q[i];
    }
    for(int i=0;i<n;i++){
        cin>>z[i];
    }
    int size=n;
    Bitree t=createBitree(q,z,size);
    hdisplay(t);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_47245991/article/details/107924587