加载中…
个人资料
翟码农
翟码农
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,525
  • 关注人气:24
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

二叉树遍历错误解析

(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指
    CreateBTree(A);  //向指针A所指向的。可是在此函数我们是为B申请了空间的,所以A始终是野指针。
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);
                return B;
}
}

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语句体
           //编写一个小代码试了下:int *p;if(p){printf("hello,world");}
    //发现NULL指针和野指针的很明显的区别,让我又学习了一点小知识。
{
B=(BTree)malloc(sizeof(Node));
printf("dkfjkla");
B->data='A';
printf("%c",B->data);
Output(B->left);
Output(B->right);
}
else
return NULL;
}
运行后发现是有限循环,按我理解是无限循环。可能是递归消耗了堆栈空间,不知道我想得对不对,有请大家抛出高见。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有