赞
踩
我们在学习二叉树结构时,不可能总是遇到满二叉树或完全二叉树,此时我们就不太适合用数组方
法存储,因此,链式结构的二叉树应运而生了。
在学习链式二叉树之前,我们需要先了解一下如何去遍历一棵完整的树
与顺序表和链表不一样,树的遍历顺序分以下几种:
前序:根、左子树、右子树
中序:左子树、根、右子树
后序:左子树、右子树、根
(导致遍历根的时机不同,但会有天差地别)我们以下面的树为例
其中,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,希望大家
多多关注!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。