有关创建二叉树的时函数无法终止的问题

jqmoab 2005-10-27 03:39:06
为了深入掌握数据结构,我编写了二叉树的程序,包括其先序创建和先序遍历函数,
例如要建立如下二叉树:
A
/ \
B C
运行时按先序遍历依次输入AB##C##,其中#表示空子树。
可是在运行时,字符已输入完毕,创建函数却无法终止。
程序编译正确,无错误和警告。这个问题已困扰我多天,请高手出手相助。
程序如下:
#include <stdlib.h>
#define OK 1
#define ERROR 1
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

int CreateBiTree(BiTree T)
{
char ch;
scanf("%c%c",&ch);/*不采用%c%c的话,下一次递归时将上一次的回车符作为输入*/
if(ch=='#') T=NULL;
else {
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}

void preorder(BiTree p)
{
if(p!=NULL)
{
printf("%6c",p->data);
preorder(p->lchild);
preorder(p->rchild);
}
}

void main()
{
BiTree T=NULL;
CreateBiTree(T);
preorder(T);
}
...全文
283 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jqmoab 2005-10-28
  • 打赏
  • 举报
回复
to Waiting4you(毛毛):
我知道在C++下改成int CreateBiTree(BiTree &T)是没有问题,但是我想在C中实现呵。
jqmoab 2005-10-28
  • 打赏
  • 举报
回复
to Waiting4you(毛毛):
按照你的方法,在TC2.0下编译通过,运行时输入数据仍然不会终止哦!程序如下:
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree CreateBiTree()
{
BiTree T;
char ch=getchar();
if(ch=='#')
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return T;
}
void preorder(BiTree p)
{
if(p!=NULL)
{
printf("%6c",p->data);
preorder(p->lchild);
preorder(p->rchild);
}
}
main()
{
BiTree T=CreateBiTree();
preorder(T);
free(T);
}
Waiting4you 2005-10-28
  • 打赏
  • 举报
回复
如果你用的是C++的话把int CreateBiTree(BiTree T)改成int CreateBiTree(BiTree &T)试试
jqmoab 2005-10-28
  • 打赏
  • 举报
回复
是呵,教材就是这样的类c语言,经过修改,虽然能成功通过编译,但是递归无法终止,没办法,只好上网求教。
Waiting4you 2005-10-28
  • 打赏
  • 举报
回复
那就int CreateBiTree(BiTree T)改成int CreateBiTree(BiTree *T),不过这样要改的地方不少,*T,(*T)->,&(*T)->lchild一大堆,不想晕的话还是改成返回值形式的.
你从教材上抄的怎么也有这么多问题?
donwmufromdying 2005-10-27
  • 打赏
  • 举报
回复
你的程序漏洞太多了,
define ok 1
define error 1
都一样!
递归做的也不对,
用malloc分配没有free
jqmoab 2005-10-27
  • 打赏
  • 举报
回复
我的程序是改自严蔚敏的《数据结构》教材上的二叉树创建算法,我希望不作太大的改动就可以运行。
jqmoab 2005-10-27
  • 打赏
  • 举报
回复
但是我希望的是,在主函数中定义树的根T,然后将其作为参数传递至CreateBiTree(BiTree)函数中创建这棵树呵。
你这样的话就不是传递参数了。
Waiting4you 2005-10-27
  • 打赏
  • 举报
回复
void main()
{
BiTree T=NULL;
CreateBiTree(T);
preorder(T);
}
在CreateBiTree(BiTree T)里对T的操作是无效的,所以在main里T一直是NULL,改成这样:
BiTree CreateBiTree()
{
BiTree T;
char ch=getch();
if(ch=='#')
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return T;
}
void main()
{
BiTree T=CreateBiTree();
preorder(T);
getch();
}
另外,好像你忘记free内存了,再练习练习:)

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧