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

it2025-09-07  6

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

最新回复(0)