首先是二叉树节点声明如下
typedef struct BinTreeNode
{
char tData;
struct BinTreeNode *lchild;
struct BinTreeNode *rchild;
}BinTreeNode;
建立二叉树的函数如下:
void buildTree (BinTreeNode
* Tree)
{
char tmp;
printf("please input the data
\n");
scanf("%c",&tmp);
fflush(stdin);
if(tmp=='#')
Tree=NULL;
else
{
Tree=(BinTreeNode*)
malloc(sizeof(BinTreeNode));
assert(Tree!=NULL);
Tree->tData=tmp;
buildTree(Tree->lchild);
buildTree(Tree->rchild);
}
}
最后在调用时的部分代码如下:
BinTreeNode *tree=(BinTreeNode*)
malloc(sizeof(BinTreeNode));
buildTree(tree);
然后发现错误是,调用了建立二叉树函数之后,树不会返回到调用函数,即这个指针tree不会是建立树的根节点。
在网上查阅了正确的方法有如下几种:
1.使用引用调用
typedefstructnode
{
structnode *leftChild;
structnode *rightChild;
chardata;
}BiTreeNode, *BiTree;
voidcreateBiTree(BiTree &T)
{
charc;
cin >> c;
if('#'== c)
T = NULL;
else
{
T = newBiTreeNode;
T->data = c;
createBiTree(T->leftChild);
createBiTree(T->rightChild);
}
}
2.根节点作为构建二叉树函数的返回值
//节点声明,数据域、左孩子指针、右孩子指针
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序建立二叉树
BiTree CreateBiTree(){
char ch;
BiTree T;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;//返回根节点
}
以上两种方法中都用到了一个结构指针的定义方法
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
即在typedef 结构体内容 后面有一个 *BiTree,这个定义之前我不是很理解,但是在查阅了typedef的用法过后,我能够理解了。
typedef 用法的一个例子:
typedef
char *pointerC;
就是给指向字符的指针命一个新名字 叫pointerC。
之后就用这个名字来声明:
pointerC a;
变量a为指向字符的指针。
这里同理可以理解,只不过把typedef
char *pointerC; 中的char换成了一个定义很长的结构体,
typedefstruct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
即红色部分相当于char。。
所以BiTree是 指向上述结构体的指针类型 的新名字。
BiTree a;
和我之前代码中BinTreeNode *
a;是在做同一件事。只不过现在我这么弄了以后不好使用引用调用的方法。
========================================
至于本身代码的错误,在于虽然我是传递指针作为参数,但是在函数中有语句
Tree=(BinTreeNode*)
malloc(sizeof(BinTreeNode));
这个语句导致了传递的实参指向的位置发生了改变,和形参指针指向的不是一个位置了,所以才会出现改动无法传递回去的情况。
有了这个不仅仅是buildTree(tree);这个调用没有传递回去,其实buildTree(Tree->lchild);
buildTree(Tree->rchild);这两个应该也是没有传递回去的。