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



#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))就是实实在在的开辟了一个空间,我在一级指针*的基础上用二级指针进行操作**来操作的。

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