二叉树遍历错误解析
(2012-07-10 20:08:09)
标签:
二叉树的遍历it |
分类: 数据结构 |
错误程序:
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char data;
struct node *left;
struct node *right;
}Node;
typedef Node * BTree;
BTree CreateBTree(BTree B);
BTree Output(BTree B);
int main()
{
BTree A;
//解析,这里定义的A本来想事指向树的根节点的。可这里传到B,就相当于B=A,即指针B指
Output(A);
return 0;
}
BTree CreateBTree(BTree B)
{
char ch;
ch=getchar();
if(ch=='#')
{
return NULL;
}
else
{
B=(BTree)malloc(sizeof(Node));
B->data=ch;
CreateBTree(B->left);
//虽然没申请了一个节点空间,但我们是要创建树,即此时结点左指
//针无指向,继续调用自身时,使得下一个B指针指向上个节点左指针所指向的,然后我们又为B申请了空间。
//有点类似这种关系:
int *left; int B; B=left;
B=malloc();
//最终效果就是left无指向,而B指向新申请的空间,两者根本就没联系。也就是说这里创建的都是分散的结点
CreateBTree(B->right);
}
}
BTree Output(BTree B)
{
if(B)
{
printf("dkfjkla");
printf("%c",B->data);
//A无指向,B=A,都是野指针,何来存储的数据,所以会引起错误
Output(B->left);
Output(B->right);
}
else
return NULL;
}
后把output函数改成如下:
BTree Output(BTree B)
{
if(B),//if无法判断一个指针是正常指针还是“野指针”,这里当作正常指针一样执行if语句体
{
B=(BTree)malloc(sizeof(Node));
printf("dkfjkla");
B->data='A';
printf("%c",B->data);
Output(B->left);
Output(B->right);
}
else
return NULL;
}
运行后发现是有限循环,按我理解是无限循环。可能是递归消耗了堆栈空间,不知道我想得对不对,有请大家抛出高见。
前一篇:卡特兰数