#include
成都创新互联是少有的做网站、成都网站制作、营销型企业网站、微信小程序、手机APP,开发、制作、设计、买链接、推广优化一站式服务网络公司,从2013年开始,坚持透明化,价格低,无套路经营理念。让网页惊喜每一位访客多年来深受用户好评
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define NULL 0
typedef int status;
typedef struct bitnode{ /*二叉树的结点*/
char data;
struct bitnode *lchild,*rchild;
}bitnode,*bitree;
bitree t;
status createbitree(bitree *t) /*按先序次序输入值建立二叉树*/
{
char ch;
scanf("%c",ch);fflush(stdin);/*清除缓存区里的回车*/
if(ch=='*') *t=NULL;/*这里以星号作为结束标志*/
else{
if(!(*t=(bitnode *)malloc(sizeof(bitnode))))exit(OVERFLOW);
(*t)-data=ch;
createbitree(((*t)-lchild));
createbitree(((*t)-rchild));
}
return OK;
}
status visit(char ch) /*对二叉树每个结点元素的访问操作*/
{
printf("%c",ch);
return OK;
} /*你这个visit函数好像没什么作用?可以删掉*/
status preordertraverse(bitree t) /*按先序访问二叉树*/
{
if(t)
{
printf("%c",t-data);
if(preordertraverse(t-lchild))
if(preordertraverse(t-rchild))return OK;
return ERROR;
}else return OK;
}
status jh(bitree t)
{
bitree x;
x=t-lchild;
t-lchild=t-rchild;
t-rchild=x;
return OK;
}
status exchange(bitree t) /*交换二叉树中所有结点的左、右子树*/
{
if(t)
{
jh(t);
if(jh(t-lchild)) /*这里是最重要的地方,你好像写错了吧*/
if(jh(t-rchild))return OK;
return ERROR;
}else return OK;
}
void main()
{
printf("input to create binary tree:\n");
createbitree(t); /*按先序建立二叉树*/
printf("create ok");/*提示createbitree函数没有出问题*/
exchange(t);/*交换每个结点的左、右子树*/
printf("\n");/*输出一个换行*/
preordertraverse(t); /*按先序访问修改后的二叉树*/
getch();
}
我试过了,可以
答案是有的。
visit是自己写的函数的指针。用来输出你遍历遇到的节点。
拓展:
C语言于1972年11月问世,1978年美国电话电报公司(ATT)贝尔实验室正式发布C语言,1983年由美国国家标准局(American National Standards Institute,简称ANSI)开始制定C语言标准,于1989年12月完成,并在1990年春天发布,称之为ANSI C,有时也被称为 C89 或 C90。
Visit在这里代表一个泛用的过程,也就是说对子树进行操作的过程。比如说这整个过程,如果是想要输出对应的节点,那在里面可能就是
void Visit(TNode *node)
{
coutnode-value" ";
}
这样的样子;或者,比如要交换每个节点的左右子树,那就是
void Visit(TNode *node){
TNode *temp = node-left;
node-left = node-right;
node-right = temp;
}
这样的形式。总之就是任何可以对单个节点进行操作的代码,根据需要而定。
二叉树遍历是不需要标记的,因为树形结构,每个节点不可能访问超过一次(不存在环的缘故)。
这是复杂指针中最容易看懂的一种啦,搜索一下就会有人教你怎么看。基本方法是先右后左,遇小括号回头。习惯一下如下的读法,看多了就习惯了。
int (* Visit)(int e)
从Visit向右看,遇到括号,回头向左,看到*,所以Visit是一个指针。继续向左看,遇到括号,回头向右,看到(int e),这是一个参数为int的函数(为什么这样看,本能了^_^)。读到现在,已经知道Visit是一个指向参数为int的函数的指针,但函数的返回类型还没弄清楚。右边已经没有了,回头向左,看到int,这是函数的返回类型。
因此,Visit是一个函数指针,它指向的函数为int fun(int e)。注意,对Visit来说,它一点也不关心函数名,只要参数和返回值符合如上定义的,这个指针就可以调用。这个函数在哪呢,就是:
int Print_Element(int e)
{
printf("%d ", e);
return 0;
}
所以书上就说,Pre_Order_Traverse在先序遍历时,会调用这个函数来输出节点。
定义Visit时,只要把某个要调用的函数的名字改成(Visit*),其余不动,就可以正确写出这个指针。以后学到动态链接库的时候,这种指针是很常见的,用多了就和吃饭一样简单
应该没错,就是想输出结点数据呗,直接cout。Visit函数是对数据元素操作的具体函数。比如您要先序遍历,肯定要输出树上每个节点的数值吧。输出函数就可以写在Visit函数中的。那样程序运行之后,就可以输出二叉树的先序遍历了。
可以是输出结点,也可以是计算结点
当你先序遍历时,他就可以是输出结点