关于二叉树的创建(二级指针法和一级指针法)

新手一枚,有问题请指正。
这几天在学习二叉树,单单是创建这里就很迷惑,为什么要用二级指针这一说法,这个问题我谈一下我的看法与感受,其中一些看法是关于我当时在写的时候的困惑点(我是参照《大话数据结构》这本书来学习的,正在学习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),请注明出处,谢谢

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值