构造二叉树的问题
在构造前序遍历的二叉树时
const char *CreateBiTree(BiTree &T, const char *s)
{
if (*s==’#’)
{
T = NULL;
return s+1;
}
else
{
T = new BiNode;
T-> data = *s;
s = CreateBiTree(T-> lchild, s+1);
s = CreateBiTree(T-> rchild, s);
return s;
}
为什么左子树是s+1,右子树是s
[解决办法]
很明显,指针s指向一个数组,里面保存了按照前序顺序的二叉树各个节点的数据。#表示叶子节点内的数据。
前序遍历:先访问根节点,然后访问左子树,最后访问右子树。
于是上面的算法就很容易明白了。
设s为root,l1,l11,l12,l2,l21,l22。
1)T-> data = *s;
构造根节点并赋值;
2)s = CreateBiTree(T-> lchild, s+1);
从数组里取得左子树的数据s+1,构造左子树并赋值;
最终将返回l2
3)类上,构造右子树并赋值。
自己构造个前序二叉树数组,按照算法画画图一切都搞清楚了。
另外:难道老师没说s是什么吗?