前面有写过已知先序和中序的建树过程,其实大概原理都差不多。
只不过层次遍历序列比较特殊,它的结点、左子树、右子树不能一下看出。
中心思想:
通过中序序列找到根结点索引(根结点之前为左子树,之后为右子树),再从层次序列分别找到对应的左、右子树(要注意按照层次序列的顺序去找,代码中双重循环处体现,原因是:要保持递归的第一个参数是层次遍历序列,第二个参数是中序遍历序列)。
#include <iostream>
#include <string.h>
#define type char
using namespace std;
typedef struct tree
{
type data; //结点数据
tree *l,*r; //左结点、右结点
}btree;
btree *create(type *layer,type *mid,int len)
{
if(len<=0)return NULL;
btree *p=new btree;
p->data=*layer; //存根结点
int i,index;
for(i=0;i<len;i++)
if(*layer==mid[i])
{ index=i;break; //根结点索引
}
int j,k=0;
type t1[105];
//从层次遍历序列找到左子树存入一个新的数组
for(i=0;i<len;i++) //此行与下一行顺序不可调换
for(j=0;j<index;j++)
{ if(layer[i]==mid[j])
t1[k++]=layer[i];
}
t1[k]='\0'; //不写没影响
p->l=create(t1,mid,k); //创建左子树
j=index+1,k=0;
type t2[105];
//从层次遍历序列找到右子树存入一个新的数组
for(i=0;i<len;i++)
for(j=index+1;j<len;j++)
{ if(layer[i]==mid[j])
t2[k++]=layer[i];
}
t2[k]='\0'; //不写没影响
p->r=create(t2,mid+index+1,k); //创建右子树
return p;
}
int main()
{
type *layer=new type[105];
type *mid=new type[105];
cin>>layer>>mid; //输入层次、中序遍历序列
btree *root=create(layer,mid,strlen(mid));
return 0;
}