请大家看下这个二叉树的遍历算法

来源:百度知道 编辑:UC知道 时间:2024/06/04 02:26:55
这个程序要实现二叉树的创建和遍历,其中创建函数没有问题,但是在遍历时有点小问题:只要一递归(就是遍历其左右子树那两句),就出现死循环,这两我在下面注释掉了,请高手帮忙看看到底是哪个地方逻辑错了,感激不尽!!!
#include <stdio.h>
#include <stdlib.h>
#define Error 0
#define OVERFLOW -2
#define OK 1

typedef char DataType;

typedef struct BNode { //定义二叉链表结点结构
DataType data;
struct BNode *lchild,*rchild;
}BNode;
typedef BNode * BinTree;

void createBinTree(BinTree * bptr) {//注意此时bptr是二级指针!!

BinTree bt = *bptr = (BinTree)malloc(sizeof(BNode));
if(!(bt)) {
printf("Space not enough!Exit.");
exit(OVERFLOW);
}
printf("\ninput a node: ");
scanf("%c%*c",&bt->data);
if(bt->data == '#') {
free(bt);
bt = NULL;
}
else {
if(bt->data >= 'a' && bt->data <=

一开始看输出代码时,虽然比较罗嗦,但是觉得没什么问题,感觉是你建树有问题,尤其是申请bt,当bt->data=='#'时又free掉,为什么不先判断输入的字符是否是'#'呢?后来自己编了一个建树函数,发现输出函数没问题,建树函数如下,供你参考
void newtree(BinTree *T)
{
char c;
printf("\ninput a node: ");
scanf("%c%*c",&c);
if(c!='#')
{
*T=(BinTree)malloc(sizeof(BNode));
(*T)->data=c;
newtree(&(*T)->lchild);
newtree(&(*T)->rchild);
}
else
*T=NULL;
}
----------------------
啊 灵机一动,终于找到你错误的根源了,嘿嘿,很容易忽视的地方
if(bt->data == '#') {
free(bt);
bt = NULL;//改为 *bptr=NULL;
}
bt是函数中的变量,bt=NULL不能返回到主函数