该函数需要用到递归的方法,但是思考的思路比较简单,只要注意有两个参数比较难写。
void CreateByQ(BiTree ** Tree,char *pre,char *mid,int preStart,int midStart,int number)
{
int k = SearchInMid(pre[preStart],mid);
(*Tree) = (BiTree *)malloc(sizeof(BiTree));
(*Tree)->data = pre[preStart];
if(k == midStart)
(*Tree)->lchild = NULL;
else
CreateByQ(&(*Tree)->lchild,pre,mid,preStart+1,midStart,k-midStart);
if(k == midStart+number-1)
(*Tree)->rchild = NULL;
else
CreateByQ(&(*Tree)->rchild,pre,mid,k+1+preStart-midStart,k+1,number-k-1+midStart);
}
前序的时候是在右子树递归的时候比较难,最主要是中途的递归完毕回到起始的时候比较难操作,其中preStart是代表前序的起始位置,应该是k-midStart确定左子树的数据个数,然后前跳这么多个数,最后把第K个已经使用的数跳过也就是+1。然后number是代表中序序列的个数,应该是本来这趟的数据减去左子树的数据个数然后减去一个1(数数的问题)。
例子:
当你在混乱的时候或者不知道怎么写出来这个参数的时候,就自己Debug一次,这样可以在理清思路的同时自己找去其中的规律。