一、引入
我们认识的线性结构中,每个结点至多有一个后继结点,而树形结构可以有一个或多个树形后继结点,也就是说树形结构可以用来表示更为复杂的数据。我们看到他有的时候回提问题,树形结构计算机要如何存储呢?其实我们对他并不陌生,例如我们计算机的目录就可以通过这个结构给显示出来:
二、二叉树
我想不论是一般树还是森林,我们都可以先通过学习二叉树,进而找到他们共同与不同的地方,类比的进行。
- What
我们每个人现在心里给他一个定义,官方的定义是由一个根及两颗互不相容的左子树和右子树组成,其中左子树和右子树也均为二叉树。 - 好处
二叉树的使用,很好的体现了分治的思想,我们研究它的时候可以从它的左后孩子入手一分为二,研究孩子二叉树的时候也是一分为二,便利了很多。
2.1 性质
如果二叉树的深度为h,方便我们后续的使用;同时这里也说明一下我们常常混淆的满二叉树,完全二叉树和非完全二叉树都说明一下。
当深度为h
二叉树每层排满了最多有2^(h-1)个;二叉树所有结点最多有2^h-1个,其实这个来源是等比数列,每层的相加: 20+21+22+... +2^(h-1)等比数列的求和很容易得出所有结点的个数;同时对于任意一个二叉树,度为0的节点的个数比度为2的节点的个数多一个,即: n0=n2+1; 我们也很容易得出,最初只有一个节点是,度为0的个数为1,之后每增加一个度为2的节点,相对会增加一个度为0的节点。完全二叉树
知道完全二叉树的前提是了解满二叉树,从定义理解,满二叉树即为根节点都有两个左右孩子节点,如下图:
这样的话,我们理解完全二叉树就很容易了。完全二叉树是在满二叉树的基础上,删除最后一层的节点,并且删除的这些节点是连续的同时包含最大编号的节点。例如:
但是这样的,没有包含最大的编号,显然不是完全二叉树,同时也没有连续,也不符合完全二叉树的特性了:
2.2 遍历
二叉树的遍历,按照根节点的位置可以分为先序、中序、后序遍历;按照层次亦可以进行层次遍历,由上至下,从左到右。
根节点的位置
按照根节点的位置进行遍历,其中的思想有递归的体现,为什么这样说呢?比如说我们按照先序的方式访问一个二叉树,即为根左右的方式,当访问 完根节点访问做孩子时,左孩子也是一个二叉树,同样我们也要按照先序的方式进行遍历,也就是说我们访问孩子节点时,需要访问孩子节点时,需要先访问孩子的孩子才可以,同时也有点先进后出的意思,跟我们栈的思想又很相像,慢慢的返现好多知识都是相通的~我们举个中序(左根右)遍历例子,如下图我们用箭头表示行走的路线,当访问这个节点时我们用星号标记一下:从图中可以看出,最开始走到8才开始第一个访问8,最终的遍历顺序是:8,4,5,2,10,5,1,6,13,3,7,15
层序遍历
二叉树的层序遍历相对而言简单一些,按照从上到下,由左至右的顺序遍历,这里他的遍历和队列很相似,例如这样一颗简单的二叉树他的层序遍历结果是:1,2,3,4,5,6,7
这里我们可以结合队列说一下,我们设置一个队列Q,用来存放二叉树的节点,首先我们将根节点放入队列当中:
我们从队列中拿出根节点访问,并将该节点(如果有孩子节点的话)的孩子节点放入队列中,如果没有孩子孩子节点我们直接从队列中拿出该节点访问,不用插入孩子节点了,访问完,再继续访问下一个节点;例如我们拿出1节点访问,将1节点的孩子节点(从左至右)放入队列中:
同理不做解释我们将2节点从队列中取出,访问2,并将孩子节点放入对列中:
同理不做解释我们将3节点从队列中取出,访问3,并将孩子节点放入对列中:
接下来我们从队列中取出4访问,他没有孩子节点,没有元素入队了,我们继续取出5访问,同理一次将队列取完了。在这个过程中,队列中存的元素最多的时候有几个呢?他们又是什么元素?我想这一定是数据结构考试中常问的的问题,这里给大家解答了。通过以上我们将层序遍历很好的和队列结合了一下子~
2.3 存储结构
二叉树的存储结构主要有顺序存储和链式存储,由于时间的缘故这里就不和大家展开说明了,感兴趣的TX可以自行研究一下~
三、吐槽
题目不是从树到堆吗?谁能告诉我堆在哪里,亲们莫要吐槽,欲知后续,请看下集分享~小编已深陷数据结构的泥潭,无法自拔~