先看下creat这个函数:
status creat(bitnode *t)/*先序建立二叉树*/
{
char ch;
ch=getch();putch(ch);
if(ch=='0') t=NULL;
else
{
t=(bitnode *)malloc(sizeof(bitnode));
if(!t)
exit(OVERFLOW);
t->data=ch;
creat(t->lchild);
creat(t->rchild);
}
return OK;
}
其中有句代码是t=(bitnode *)malloc(sizeof(bitnode));
这是给t赋值,由于t是参数,这样做是不能返回的。
我知道你的意思是想通过指针返回,但是那样的用法应该是对t所指向的变量赋值,也就是对*t赋值。
如果你还没理解的话看下函数里的递归调用:creat(t->lchild);调用函数后,本意是要给t->lchild赋值的,但是是做不到的,因为要改变一个变量的值的话,应该传的是它的地址。
可能你觉得有点乱了,我举个函数中用指针做参数来返回的例子:
假如要用指针返回一个整型的变量,那么指针应该是指向整型变量的,即int*
这里应该是要返回一个struct bitnode *类型的,也就是返回的值就是个指针,那么参数就应该是一个指向这种指针的指针,即struct bitnode **
可以这么修改:
status creat(bitnode **t) //多了个*
{
char ch;
ch=getch();putch(ch);
if(ch=='0') *t=NULL; //多了个*
else
{
*t=(bitnode *)malloc(sizeof(bitnode)); //多了个*
if(!*t) //多了个*
exit(OVERFLOW);
(*t)->data=ch;
creat(&(*t)->lchild); //注意不同
creat(&(*t)->rchild);
}
return OK;
}
主函数这么改
status main()
{
bitnode* t1; //多了个*
creat(&t1);
pre(t1,print); //少了个&
getch();
return 0;
}
另外一个编译错误就是
int pre(bitnode *t,status (*visit)())
指针函数后面应该带参数,改为
int pre(bitnode *t,status (*visit)(bitnode *))
二叉树的遍历可分为三种:前序遍历,中序遍历,后续遍历。
前序遍历是指在访问根节点、遍历左子树与遍历右子树这三者中先访问根节点,然后遍历左子树,最后遍历右子树;并且遍历左右子树时,仍然先访问根节点,然后遍历左子树,最后遍历右子树。
中序遍历是指在访问根节点、遍历左子树与遍历右子树这三者,首先遍历左子树,然后访问根节点,最后遍历右子树;并且遍历左右子树时,仍然先遍历左子树,然后访问根节点,最后遍历右子树。
后序遍历是指在访问根节点、遍历左子树与遍历右子树这三者中,首先遍历右子树,然后访问根节点,最后遍历左子树;并且遍历左右子树时,仍然先遍历右子树,然后访问根节点,最后遍历左子树。
慢慢看,其实很好背,你懂的``````
mr.dongge@foxmail.com
#include
using
namespace
std;
typedef
struct
BinaryTree
{
char
data;
struct
BinaryTree
*lchild,*rchild;
}BinaryTree,*BiTree;
void
CreateBiTree(BiTree
&T)
{
char
z;
if((z=getchar())=='
')
T=NULL;
else
{
T=(BinaryTree*)malloc(sizeof(BinaryTree));
T->data=z;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序遍历
void
preBiTree(BiTree
T)
{
if(T!=NULL)
{
cout<
preBiTree(T->lchild);
preBiTree(T->rchild);
}
}
//中序遍历
void
InBiTree(BiTree
T)
{
if(T!=NULL)
{
InBiTree(T->lchild);
cout<
InBiTree(T->rchild);
}
}
//后序遍历
void
PostBiTree(BiTree
T)
{
if(T!=NULL)
{
PostBiTree(T->lchild);
PostBiTree(T->rchild);
cout<
}
}
int
Depth(BiTree
T)
{
if(T==NULL)
{
return
0;
}
else
return
1+(Depth(T->lchild)>Depth(T->rchild)?
Depth(T->lchild):Depth(T->rchild));
}
void
main()
{
BiTree
T;
cout<<"请输入相应二叉树:"<
cout<<"二叉树的先序遍历为:"<
cout<
cout<
cout<
不跟你说是函数指针那的问题嘛,自己对照着看调用方法,运行过,自己试
#include
#include
#include
#define OK 1
#define OVERFLOW -2
#define ERROR -1
typedef int status;
typedef struct bitnode
{
char data;
struct bitnode *lchild,*rchild;
}bitnode;
status creat(bitnode *t)/*ÏÈÐò½¨Á¢¶þ²æÊ÷*/
{
char ch;
ch=getch();
putch(ch);
if(ch=='0') t=NULL;
else
{
t=(bitnode *)malloc(sizeof(bitnode));
if(!t)
exit(OVERFLOW);
t->data=ch;
creat(t->lchild);
creat(t->rchild);
}
return OK;
}
/*ÏÈÐò±éÀú*/
int pre(bitnode *t,status (*visit)(bitnode *))
{
if(t)
{
if(visit(t))
if(pre(t->lchild,visit))
if(pre(t->rchild,visit))
return OK;
return ERROR;
}else
return OK;
}
/*ÏÔʾ*/
status print(bitnode *t)
{
printf("%c\n",t->data);
return OK;
}
status main()
{
bitnode t1;
creat(&t1);
pre(&t1,print);
getch();
return 0;
}
主要是函数指针那的问题,注意调用方法即可
#include
#include
#include
#define OK 1
#define OVERFLOW -2
#define ERROR -1
typedef int status;
typedef struct _bitnode ////////////////bitnode修改为_bitnode
{
char data;
struct _bitnode *lchild,*rchild; ///////bitnode修改为_bitnode
}bitnode;
/*先序建立二叉树*/
status creat(bitnode **t)//////////////////////////要多加个*
{
char ch;
ch=getch();
putch(ch);
if(ch=='0') *t=NULL; //////////////////////////要多加个*
else
{
*t=(bitnode *)malloc(sizeof(bitnode)); //////////////要多加个*
if(!t)
exit(OVERFLOW);
(*t)->data=ch;//////////////////////////////////////要多加个*
creat(&(*t)->lchild); ///////////////////////////////要多加个&和*
creat(&(*t)->rchild); ///////////////////////////////要多加个&和*
}
return OK;
}
/*先序遍历*/
//int pre(bitnode *t,status (*visit)()) //////////////////////注意后面这个参数,修改如下面这行
int pre(bitnode *t,status (*visit)(bitnode *))
{
if(t)
{
if((*visit)(t))
if(pre(t->lchild,visit))
if(pre(t->rchild,visit))
return OK;
return ERROR;
}
else
return OK;
}
/*显示*/
status print(bitnode *t)
{
printf("%c\n",t->data);
return OK;
}
status main()
{
bitnode* t1; //////////////////////////要多加个*
creat(&t1);
pre(t1,print); //////////////////////////去掉&
getch();
return 0;
}