重建二叉树(已知两序求另一序)

来源:互联网 发布:阿里云免费套餐 编辑:程序博客网 时间:2024/06/05 08:50

重建二叉树,有两种情况:

由先序,中序求后序

由后序,中序求先序

因为中序的存在用作划分左右子树, 代码中应用了串的长度来划分子树

模拟一遍就是:

1. pre[]="ABDGHCEFI" ,

    in[   ]="GDHBAECIF";

pre[0]就是根,在in中可知A的下标p为4; GDHBAECIF红色部分是左子树,紫色部分是右子树

左子树长度为4,那么pre+1到pre+1+p就是左子树 ; pre+p+1到最后就是右子树

最后递归求解,

同理:

2. char in[]="GDHBAECIF"

         pos[]="GHDBEIFCA";

A在in中的下标p为4,则在pos中,左子树:pos到pos+p , 右子树pos+p到最后

#include<iostream>#include<cstring>using namespace std;void dfs_pre(char*in , char*pos , int len){    if(len<=0)return;    int p = strchr(in,pos[len-1])-in;    cout<<pos[len-1];    dfs_pre(in,pos,p);    dfs_pre(in+p+1,pos+p,len-p-1);}void dfs_pos(char *in, char*pre , int len ){    if(len<=0)return;    int p = strchr(in,pre[0])-in;    dfs_pos(in,pre+1,p);    dfs_pos(in+p+1,pre+p+1,len-p-1);    cout<<pre[0];}int main(){    char pre[]="ABDGHCEFI",in[]="GDHBAECIF",pos[]="GHDBEIFCA";    dfs_pos(in,pre,strlen(in));    cout<<endl;    dfs_pre(in,pos,strlen(in));    cout<<endl;    return 0;}


0 0