先附上错误代码
//二叉树的前序遍历算法,采用递归调用的方式
void preordertraverse(BiTNode* a)
{
if(a == NULL)
{
return;
}
cout << "data : " << a->data << endl;
preordertraverse(a->lchild);
preordertraverse(a->rchild);
}
void createBiTree(BiTNode* a) //用一级指针有问题,因为不能访问!
{
Telemtype data;
cout << "data = " << endl;
cin >> data;
if(data == "#")
a = NULL;
else
{
a = (BiTNode*)malloc(sizeof(BiTNode));
if(!a)
exit(OVERFLOW);
a->data = data;
createBiTree(a->lchild);
createBiTree(a->rchild);
}
}
int main()
{
BiTNode* a;
createBiTree(a);
preordertraverse(a);
return 0;
}
这段代码问题出错在,只能创建二叉树,但是不能遍历访问二叉树,因为preordertraverse(a)中的a并没有存储二叉树的首地址,a = =NULL。
修改:要将二叉树的形参设置为二级指针。
void createBiTree(BiTNode** a) //注意这里要用二级指针,一级指针作为作为形参,不能返回帧栈中创建的变量的地址!!!
{
Telemtype data;
cout << "data = " << endl;
cin >> data;
if(data == '#')
*a = NULL;
else
{
*a = (BiTNode*)malloc(sizeof(BiTNode));
if(!*a)
exit(EOVERFLOW);
(*a)->data = data;
createBiTree(&(*a)->lchild);
createBiTree(&(*a)->rchild);
}
}
int main()
{
BiTNode* b;
createBiTree(&b);
preordertraverse(b);
return 0;
}
补充:
遍历线索二叉树的时候(以中序举例),需要注意代码思路,和先迭代左子树,再访问根结点,最后迭代右子树是一样的!
/*以下为遍历函数*/
//思路就是先向左子树遍历,采用的依据就是判断ltag是否是0,之后通过p->rtag==1找到根结点,再p=p->rchild找到右子树。
int inordertraverse_thr(BithrNode* t) //t指向头节点
{
BithrNode* p;
p = t->lchild; /*p指向根结点*/
while(p != t)
{
while(p->ltag == link) //找到并输出该树中最左的孩子
p = p->lchild;
cout << p->data << endl; /
while(p->rtag == thread && p->rchild != t) //输出该树的根结点
{
p = p->rchild;
cout << p->data <<endl;
}
p = p->rchild; /*跑向右孩子*/
}
return 0;
}