数据结构——二叉树(4)——链式二叉树

我们在学习二叉树结构时,不可能总是遇到满二叉树或完全二叉树,此时我们就不太适合用数组方

法存储,因此,链式结构的二叉树应运而生了。

在学习链式二叉树之前,我们需要先了解一下如何去遍历一棵完整的树

与顺序表和链表不一样,树的遍历顺序分以下几种:

前序:根、左子树、右子树

中序:左子树、根、右子树

后序:左子树、右子树、根

(导致遍历根的时机不同,但会有天差地别)我们以下面的树为例

其中,N代表空节点,最下面的一层N是叶节点的下一层(为了方便理解)

我们先弄最简单的:

层序,即图中的1.2.4.3.5.6。(这里不需要打空)

前序:1是根,下分为左子树和右子树,故第一个访问的节点是1,然后去访问以2为根左子树,此

时2是根,那么第二个访问的是2,再去访问以3为根的子树(2的左子树),所以第三个访问的是3

然后分别去访问3的左右子树(因为3的左子树不能再分了,所以访问完3的左就去访问3的右),

所以第四第五访问的是N(3的左)与N(3的右),3的一整棵树就全部访问完了,同时3右作为2的

左树,所以此时我们要访问2的右树也就是N(第六访问),此时,以2为根的一整棵树就访问完

了,同理,我们要去访问1的右树了,走到4(第七访问),还需继续走到5(第八访问),再走到

5的左子树N(第九访问),5的右子树N(第十访问),然后到4的右子树,同理下面的访问就是

6、N、N。

所以,这棵树的前序访问顺序是:1,2,3,N,N,N,4,5,N,N,6,N,N

为了方便理解,作者在每个N上再标注一下

中序:N1,3,N2,2,N7,1,N3,5,N4,4,N5,6,N6

后序:N1,N2,3,N7,2,N3,N4,5,N5,N6,6,4,1

由于原理与前序相同,作者在此就不作过多讲解,不理解的朋友可以私信作者,一定会回!

一、正式进入链式二叉树

在学之前的数据结构(顺序表、链表等)中,我们想要实现它们的结构,基本都是完成它的增删查

改操作函数,但学习链式二叉树我们不搞这些,因为能做到这些去存储数据,我不如直接搞个链表

去存数据,显的很麻烦。在这里,我们要实现结构操作的功能,即前中后序。

在二叉树(2)中我们提到了,用链式存储二叉树我们用左孩子右兄弟法,现在我们来实现一下。

我们需要实现以下功能

但没有树,我们也无法遍历,所以,我们现在首先需要手搓一棵树。我们就搓一棵上面的那棵树。

接下来我们来实现各个功能

1.前序

在上面我们研究前序访问的时候,发现一整树可以分成根、左子树右子树,而左子树右子树又分别可以看成根、左子树右子树......一直到最底层。其实这是一种递归,它包含着子问题与结束条件(最小子问题),代码如下:

这里为了和前面的分析保持一致我们打印带上N。我们来分析它的原理。

我们从节点1的箭头出发:首先进入函数后发现不是空节点,向下走遇到函数firstorder函数,参数

是节点2,进入下一个函数,节点2也不为空,继续走,到3节点函数,3节点函数也是如此,进入

参数为NULL的函数,发现是空,打印后执行return,回到3节点的函数,(从3节点函数到NULL函

数的过程中系统为NULL的firstorder函数开辟了栈帧,执行了return后,这块栈帧自动销毁)3节点

的参数为root->left的函数结束,向下走执行3节点参数为root->right的firstorder函数,此时发现仍是

空节点,再次打印后return(此参数为空的firstorder函数开辟的栈帧与上一个空的firstorder函数相

同,即同一块栈帧的多次使用,压栈脱栈原理,下一个空的firstorder函数也如此。关于栈帧的知识

请看我前面的文章“函数栈帧的创建与销毁”)此次return后3节点的函数结束,也就是2节点的第一

个firstorder函数结束,该执行参数为root->right的firstorder函数了,发现又是一个空,再次return,

至此,2节点的函数执行结束,也意味着1的左子树所有都访问完毕,该执行1节点参数为root-

 >right的firstorder函数了,此过程就是访问1的右子树的所有节点,递归原理与左子树时相同。

2.中序:有了前序的递归原理思想,我们很轻松地写出中序的代码

3.后序:同理

4.求树的总节点

思路:左子树的节点数加右子树的节点数+自己,然后左右子树又分为自己的左右子树。。。直到

为空。

5.求树的高度

思路:与总节点相似,然后算出的结果+1(因为结果求出来的是根的左右子树中更高的高度,并

没有算上根的那一层,代码原理就是一棵树可以分为根,左右子树,然后继续下分,高度就是左右

子树中更高的加根的高度,算出最下面不可分的左右子树的高度然后向上递归即可。)

6.求第k层的节点数

思路:当前树的第k层节点数=左子树k-1层节点数+右子树k-1层节点数

7.查找某个节点

思路:先去左子树中找,没找到再去右子树找,找到就返回该节点的地址。

8.树的销毁

这个就很简单了,还是采用递归依次销毁然后最后释放空间即可

————

本文结束

以上就是作者对二叉树及其拓展的相关知识点,在之后的文章我会更新一些相关的OJ,希望大家

多多关注!

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值