设一个二叉树中各结点的值互不相同,其先序遍历和中序遍历分别存在于一维数组中,试编写算法建立该二叉树的二叉链表。
思想:由先序的第一个元素可确定该树的根,在中序中找到根,根的左右子树分别可看成一棵树,然后重复递归处理左和右子树(和处理根结点一样)。
代码:
BiTree createTree(TElemType preData[],TElemType inDate[],int preStart,int preEnd,int inStart,int inEnd){
//preData[]先序系列,inDate[]中序系列
//preStart先序第一个元素下标,preEnd先序最后一个元素下标
//inStart中序第一个元素下标,inEnd中序最后一个元素下标
BiTNode *r=(BiTNode*)malloc(sizeof(BiTNode));//创建根结点
r->data=preData[preStart]; //先序第一个元素作为根结点
int ins;//找到在中序中根结点的位置
for(ins=inStart;inData[ins]!=r->data;++ins);
int inLlen = ins-inStart;//中序中左子树长度
int inRlen =inEnd-ins;//中序中右子树长度
if(inLlen>0){//左子树不为空,创建左子树
r->lchild= createTree(preData,inDate,preStart+1,,preStart+inLlen,inStart,inStart+inLlen-1);
}else{
r->lchild=NULL;
}
if(inRlen>0){//左子树不为空,创建左子树
r->rchild= createTree(preData,inDate,preEnd-inRlen+1,preEnd,inEnd-inRlen+1,inEnd);
}else{
r->rchild=NULL
}
return r;//返回树
}