c语言递归函数编译错误,C语言递归建立二叉树时遇到的指针问题:建立的二叉树无法返回调用函数...

首先是二叉树节点声明如下

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);这两个应该也是没有传递回去的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值