求大家帮帮忙,关于二叉树递归遍历问题

[复制链接]
查看11 | 回复9 | 2021-1-27 06:48:00 | 显示全部楼层 |阅读模式
#include
#include
#defineOVERFLOW1
#defineERROR1
#defineOK0
typedefstructBiTNode{
chardata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
intCreateBiTree(BiTreeT){
/*先序输入二叉树中结点的值,以'#'表示空树*/
charch;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
returnOK;
}
intPrintElement(charc){
printf("%c",c);
if(c=='#')return1;
elsereturn0;
}
intPreOrderTraverse(BiTreeT,int(*Visit)(charc)){
//Visit是输出树结点元素的值的应用函数
//先序遍历二叉树T的递归算法,对每个非空结点调用Visit函数
if(T)
{
if(!Visit(T->data))
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))
returnOK;
returnERROR;
}
else
returnOK;//空树
}
voidmain()
{
BiTreeT;
CreateBiTree(T);
PreOrderTraverse(T,PrintElement);
printf("\n");
}
在VC6.0下编译、构建多没问题,运行,输入ABC##DE##F###回车后错误。
我看了半天没看出错误来,请大家看看我是错在哪了?先谢谢好心人了!!!

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:48:00 | 显示全部楼层
试一下修改CreateBiTree的声明:
intCreateBiTree(BiTreeT)
-〉
intCreateBiTree(BiTree&T)
回复

使用道具 举报

千问 | 2021-1-27 06:48:00 | 显示全部楼层
intPreOrderTraverse(BiTreeT,int(*Visit)(charc)){
//Visit是输出树结点元素的值的应用函数
//先序遍历二叉树T的递归算法,对每个非空结点调用Visit函数
if(T)
{
if(!Visit(T->data))//你这是判断是否为空结点啦。而且我觉得没必要这是,前面你已经if(T)了,这里你可以直接访问该结点。
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))
returnOK;
returnERROR;//这么多return???
}
else
returnOK;//空树
}
这是能运行的一个先序遍历代码。
[code=C/C++]voidpreorder(bt*t)//先序遍历
{
if(t)
{
cout<<t->data;
preorder(t->lchild);
preorder(t->rchild);
}
}

回复

使用道具 举报

千问 | 2021-1-27 06:48:00 | 显示全部楼层
引用1楼Randel的回复:试一下修改CreateBiTree的声明:
intCreateBiTree(BiTreeT)
-〉
intCreateBiTree(BiTree&T)

二楼正解,只要把直接传递指针改成指针的引用,程序就能正确输出结果了。
因为在传递指针T的时候,编译器也会为T生成一个副本_T,他们指向同样的内存空间,这个时候如果改变_T指向内容的值,外部指针指向的值也会改变,所以传递指针可以起到同步改变值的效果,但是如果在函数中对_T重新分配的内存空间,_T就指向了新的内存地址,与原来的T就区别开了,不能起到同步改变的效果。
在创建二叉树的时候,要为传递进去的指针分配节点空间,这个时候就不能直接传指针,可以用指向指针的指针,或者直接简单地用引用。
楼主也可以看看这篇文章:http://www.wangchao.net.cn/bbsdetail_44059.html指针参数如何传递内存的。
回复

使用道具 举报

千问 | 2021-1-27 06:48:00 | 显示全部楼层
上面说错了,是1楼。
回复

使用道具 举报

千问 | 2021-1-27 06:48:00 | 显示全部楼层
谢谢大家,好人啊,好人有好报啊
回复

使用道具 举报

千问 | 2021-1-27 06:48:00 | 显示全部楼层
T好像还有个*号吧???
intCreateBiTree(BiTree*T)?????是吗?
回复

使用道具 举报

千问 | 2021-1-27 06:48:00 | 显示全部楼层
好像BiTNode没有定义大小咧????
T=(BiTNode*)malloc(sizeof(BiTNode)???
什么意思???
回复

使用道具 举报

千问 | 2021-1-27 06:48:00 | 显示全部楼层
楼主好像用的是C语言啊???

回复

使用道具 举报

千问 | 2021-1-27 06:48:00 | 显示全部楼层
没有错呀
你用win-tc
运行看看就知道啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行