我刚写了递归算法,和教材上不一样的是,采用了较多的参数,s是前序序列的描述字符串,用了一个start的含义是开始创建的位置,返回的是子树创建结束后字符串指针的位置,代码如下,测试已通过了:
PS:我写的思想是通过函数的返回值,即创建完字符串指针停留的位置,
这样可以分割左右子树前序序列,而这样更便于递归的实现。
/////////////////////////////////////////////////
//PreOrderCreate()公有成员函数
//递归通过前序序列创建一棵二叉树,前序序列中
//空子树用符号'#'来代替,s是前序序列描述字符串
//返回的是创建结束后字符串停留的当前位置
/////////////////////////////////////////////////
template<class T>
int BinaryTree<T>::PreOrderCreate(
char* s,int start,BinTreeNode<T>*& subTree)
{
if(s[start]!='#') //如果当前读入的不是空子树
{
BinTreeNode<T>* newNode//创建新结点
=new BinTreeNode<T>(s[start]);
subTree=newNode; //新建立的根结点
int k=PreOrderCreate(s,//从start+1位置开始递归创建左子树
start+1,subTree->leftChild);
PreOrderCreate(s,k+1, //递归创建右子树
subTree->rightChild);
}
else
{
subTree=NULL; //创建空子树
return start; //当前子树最后一个'#'
};
};
/////////////////////////PreOrderCreate()函数结束
[[it] 本帖最后由 geninsf009 于 2008-12-3 20:02 编辑 [/it]]