二叉树的建立



                  对于二叉树的建立,自己犯了一个很严重的错误,于是就写了这篇关于二叉树中地址的博客,这是多么痛的领悟,还是先弄代码,好解释;

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
        char data;
	struct node * Lchild;
	struct node * Rchild;
}BiTree;

void CreatBiTree(BiTree *root),
{
	char ch;
	ch=getchar();
	if(ch=='.')
         root=NULL;
	else
	{
		root=(BiTree *)malloc(sizeof(BiTree));
		root->data=ch;
		CreatBiTree(root->Lchild);
		CreatBiTree(root->Rchild);
	}
}
int main()
{
	BiTree root;
	CreatBiTree(&root);
	return 0;
}

        对于上述的代码我typedef之后是BiTree而不是*BiTree这一点看好了,在主函数中我就定义了一个结构体的root变量,然后呢通过CreatBiTree()函数将&root的地址传过去,在这个函数里面我运用了递归思想创建二叉树,千万牢记的一点,在用到链表的时候一定要开辟空间,因为链表是动态开辟空间,必须程序员手动,我老是忘记开辟。如果不开辟空间,编译链接不报错,但是程序运行时直接弹出.exe已经停止工作。还是继续上面的问题,为什么CreatBiTree(root->Lchild)里面传没有地址&而CreatBiTree(&root)里面却有地址&?我就这么解释吧函数中传过去的地址&就用*来操作,CreatBiTree()函数中的root是一个指向main()函数中的root那块空间的指针变量,CreatBiTree()函数中的root比主函数main()中的root多一个一级指向。
        就直接运行上面的程序是正确的,可以创建出来,但是上面的这种创建二叉树的方法是错误的,我在主函数main()中就用root开辟了一个空间,传地址过去再用一个root=(BiTree *)malloc(sizeof(BiTree)),浪费了一个存储空间,那么首地址都改变了。所以进行后面的二叉树的遍历二叉树都是错误的,我是地址的基础上,然后用一级指针来操作。

    看一下这张图片吧,估计就懂了:

     在二叉树创建的过程中可以按下面来创建:

#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
	char data;
	struct Node *Lchild;
	struct Node *Rchild;
}BiTNode,*BiTree;
void CreatBiTree(BiTree * root)
{
	char ch;
	ch=getchar();
	if(ch=='.')//用点代表空子树
		*root=NULL;
	else
	{
		*root=(BiTNode *)malloc(sizeof(BiTNode));
		(*root)->data=ch;
		CreatBiTree(&((*root)->Lchild));
	        CreatBiTree(&((*root)->Rchild));
	}
}
int main()
{
   BiTree root;
   CreatBiTree(&root);
   return 0;
}


         这一回我在typedef的时候将结构体变成了*BiTree,与上面的代码相似程度还是很高的,这次定义一个BiTNode我是在*root=(BiTree)malloc(sizeof(BiTNode))里面测量结构体大小的时候用一下而已;这次在主函数main()中,我只是定义了一个root的指针变量(因为BiTree本身带有一个*),指针变量给它并没有开辟空间,然后调用函数 CreatBiTree(&root),*root=(BiTree)malloc(sizeof(BiTNode))就是实实在在的开辟了一个空间,我在一级指针*的基础上用二级指针进行操作**来操作的。

     这是我对上面的一些认识,如果有错误欢迎大家指正;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值