已知前中建立二叉树,并实现后序,参数建议使用字符串,以及字符串的
范围,这样可以继续对子串递归进行已知前中建立二叉数,在递归函数中
主要是通过前序和中序介定出左子树和右子树的范围,
这是我写的代码,你可以参考,
///////////////////////////////////////////////////
//私有成员函数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()函数结束