C语言中二叉树遍历问题

来源:百度知道 编辑:UC知道 时间:2024/06/02 15:08:46
在学数据结构,写了一段树遍历的程序,但是老是有错,麻烦大家帮我看一下哈
#include<stdio.h>
#include <conio.h>
#define NULL 0
#define OK 1
#define OVERFLOW -2
#define ERROR -1

typedef struct bitnode
{
char data;
struct bitnode *lchild,*rchild;
}bitnode;

bitnode *creat()/*先序建立二叉树*/
{

bitnode *t;
char ch;
ch=getch();putch(ch);
if(ch=='0') t=NULL;
else
{
t=(bitnode *)malloc(sizeof(bitnode));
if(!t)
{
printf("先序建立二叉树失败!");
exit(OVERFLOW);
}
t->data=ch;
t->lchild=creat();
t->rchild=creat();
}
return(t);
}
/*先序遍历*/
int pre(bitnode *t,int (*visit)())
{
if(t)
{
if(visit(t))
if(pre(t->lchild,visit(t->lchild)))
if(pre(t->rchild,visit(t->rchild)))
return OK;
return ERROR;
}else

语法规则与具体的IDE、编译器无关(除非使用一些特定编译器支持的不标准的特定操作,比如在TC2中可以不包含stdio.h而直接调用printf()等函数),如果你完全按照ANSI C标准写程序,就可以在任何一个现行的编译器上正确的编译,而完全无需考虑是否行的通的问题(除非有编程错误)。

TC3比TC2好是一定的,但是不建议现在还使用这两个工具,它们都是近20年前的东西了,所用的技术早已过时,而且也根本不能反映现在的硬件水平(例如,TC2只允许程序使用640KB的内存)!

强烈建议更换编程工具,不要再争论TC2与TC3谁更好的问题了!如果实在舍弃不下字符界面,就用GCC吧!

********************************************************

1.没有包含必要的头文件stdlib.h,用到了该文件中声明的一些函数,例如malloc()

2.在pre()函数中:
if(visit(t))
if(pre(t->lchild,visit(t->lchild)))
if(pre(t->rchild,visit(t->rchild)))

应改为:

if((*visit)(t))
if(pre(t->lchild,visit))
if(pre(t->rchild,visit))

3.建议将 bitnode *creat() 改为 bitnode *creat(void) 以避免部分编译器输出警告或者错误信息。

4.没有必要为NULL重新定义,请去掉相关的宏定义,如果保留,会在部分编译器中出错

第二点是导致错误的重点所在,另外如不做出第一点、第三点和第四点的更正,部分编译器可能还是会报错。

修改后的程序如下,在BCB2007中测试正常:

//--------------------------------------------------------------------------