二叉树,谁可以告诉我这个程序有什么问题吗?运行时,怎样输入的

[复制链接]
查看11 | 回复1 | 2010-12-8 01:09:50 | 显示全部楼层 |阅读模式
#include
typedef struct tree
{
chardata;
struct tree *l;
struct tree *r;
}tr;
main()
{
tr *head=NULL;
tr *create();
void preorder();
system("cls");
head=create(head);
printf("\n\n");
printf("\nThe preorder is:");
preorder(head);


}
tr *create(tr *t)
{
tr *k=NULL;
char ch;
scanf("%s",&ch);
if(ch=='!')t=NULL;
else { t=(tr *)malloc(sizeof(tr));

t->data=ch;

t->l=t->r=NULL;
t->l=create(k);
t->r=create(k);
}
return(t);
}
void preorder(tr *head)
{ tr *t=NULL;
t=head;
if(t)
{ printf("%c\t",t->data);
preorder(t->l);
preorder(t->l);
}
}

回复

使用道具 举报

千问 | 2010-12-8 01:09:50 | 显示全部楼层
楼主,你的程序没有错,也不是死循环。问题在你的creat()里面. 你用了递归,构建的是一棵满二叉树。它先构建根节点,再构建左子树,等左子树构建完了,再构建右子树。但是如果你就不断地输入非零值的话,你就没完没了地在构建左子树。注意了,由于你这个程序构建的是满二叉树(就是每个根节点都有两个子节点),结果如果你要最后要完成这左子树的构建,你需要输入的0(用来构建你的NULL节点)将随着你的树的层数呈2的指数级增长,一旦你前面输入的非零值足够多,哪怕10个,你需要输入的0的个数也会跑到8~16个之间,你如果耐性不好,当然以为进入了死循环了。你不信,把t->lchild=creat();换到t->data=x;之前,然后运行,你不要输入太多的非零值
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行