新手一枚,有问题请指正。
这几天在学习二叉树,单单是创建这里就很迷惑,为什么要用二级指针这一说法,这个问题我谈一下我的看法与感受,其中一些看法是关于我当时在写的时候的困惑点(我是参照《大话数据结构》这本书来学习的,正在学习c++,可能有些语法还不够熟练,请指正)
首先定义树的结点结构
typedef struct TreeNode{
int data;
struct TreeNode * Lchild;
struct TreeNode * Rchild;
}tnode,*ptnode;
然后定义树的结构
typedef struct BinTree{
tnode *root;
}BinTree;
其次,对二叉树初始化
void InitBinTree(BinTree *bt){
bt->root=NULL;
}
创建
void CreatBiTree(BinTree *bt,tnode** p){
int val; //当输入0的时候,定义为终止节点
cout<<"按照前序依次输入:";
cin>>val;
if(val==0){
*p=NULL;
}else{
*p=new tnode;
if(! p){
cout<<"分配失败!"<<endl;
exit(-1);
}
(*p)->data=val;
CreatBiTree(bt,&(*p)->Lchild);
CreatBiTree(bt,&(*p)->Rchild);
}
}
这里我就要解释一下,
1、首先,传入的参数BinTree bt,这个是为了让函数知道你要对哪一个树创建,可能以后写代码,你个程序有好几个二叉树(假如)。那么你就要告诉你对哪个二叉树创建。
2、其次,tnode ** p,因为你定义的BinTree结构中,root就是个指针,创建二叉树时候,肯定要先访问根节点,此时你的根节点就是个指针,那么你要修改指针的内容,自然想到二级指针(我看严老师那本书上写的是c++引用)。
3、(我当时困惑的点,记录一下,省的到时候又忘了😅,大家可选择自行跳过)。在val==0时候,为什么要p=NULL,而不是p=NULL。首先要明白,我们是将地址改为NULL的, **p是数据域,你要想定义数据域的终止节点,肯定要操控 **p的地址,而 **p的地址为*p,所以就赋给 *p=NULL了。递归的时候,(*p)->Rchild为下一次执行时候的根节点(二级指针),自然函数要写上(*p)->Rchild(一级指针)的地址了,即&(*p)->Rchild。
然鹅
事实上创建不止这一种方法(涉及到二级指针本身就很难理解)下面我将介绍一种一级指针的创建方式
ptnode creat(BinTree *bt){
int val;
cout<<"按照前序依次输入:";
cin>>val;
ptnode root=new tnode;
if(!root){
cout<<"创建失败!"<<endl;
exit(-1);
}else{
if(val==0){
root=NULL;
}else{
root->data=val;
root->Lchild=creat(bt);
root->Rchild=creat(bt);
}
}
}
我首次见到这种方式是在 《郝斌数据结构》 里面(B站有,虽然课程有点久远,但还是很不错的),他当时讲链表时候就是这么整的(后面我会把我学习链表的体会也记录下来),当时完全没有二级指针的概念,直到学二叉树时候碰到了,头疼的要死。
如有不懂,请评论区交流或者私信
若转载(这么菜应该不会吧,hhhh),请注明出处,谢谢