已知前中建立二叉树,并实现后序,参数建议使用字符串,以及字符串的
范围,这样可以继续对子串递归进行已知前中建立二叉数,在递归函数中
主要是通过前序和中序介定出左子树和右子树的范围,
这是我写的代码,你可以参考,
///////////////////////////////////////////////////
//私有成员函数CreateByprein()
//通过前序序列和中序序列建立一棵二叉树
//输入的前序和中序序列必须一'#'结束
//pre是前序序列,in是中序序列,n为二叉树结点个数
///////////////////////////////////////////////////
template<class T>
BinTreeNode<T>* BinaryTree<T>::CreateByprein1(T* pre
                        ,T* in,int n)
{
    //创建的子树的根结点指针
    BinTreeNode<T>* p;
    //递归结束的条件
    if(n==0)
        //如果二叉树长度为0,返回空
        return NULL;
    T s=pre[0];
             //在前序中的第一个元素就是根结点
    p=new BinTreeNode<T>(s);//根据取出的根结点元素创建根结点
    //在根据前序得到的根结点拆分中序序列的过程
    for(int m=0;m<n;m++)
    //在中序的序列中查找根结点的位置
    {
        if(in[m]==s)
        //m就是根结点在中序中的位置
            break;
    };
    //得到左子树的前序和中序
    T* lp=new T[m];
             //得到左子树的前序
    for(int i=0;i<m;i++)
        lp[i]=pre[i+1];
    T* li=new T[m];
             //得到左子树的中序
    for(i=0;i<m;i++)
        li[i]=in[i];
    T* rp=new T[n-m+1];
         //得到右子树的前序
    for(i=0;i<n-m+1;i++)
        rp[i]=pre[i+m+1];
    T* ri=new T[n-m+1];
         //得到右子树的中序
    for(i=0;i<n-m+1;i++)
        ri[i]=in[i+m+1];
    //递归创建左子树
    p->leftChild=CreateByprein1(lp,li,m);
    //递归创建右子树
    p->rightChild=CreateByprein1(rp,ri,n-m-1);
    //释放内存空间
    delete lp;
    delete li;
    delete rp;
    delete ri;
    //返回当前根结点的指针
    return p;
};
////////////////////////////CreateByprein()函数结束