一、树是什么东西
幼儿园的同学都知道树是什么东西,你问我树是个什么东西,愚昧,这么简单我给你讲什么。
今天我们要讲到的树是一种其实是一种简单的非线性数据结构,各个数据元素之间有很明显的关系层次。
图1 图2
如图2所示这样的数据结构,长得就像一个颗树,所以我们我们就把这种数据结构用“树”来命名。
二、基本概念
结点:树的结构中直线连接的两端叫做结点
父结点:当前结点的前件
子结点:当前结点的后件
根结点:没有父结点
叶子结点:没有子结点
度:当前结点的子结点的个数(或者这样理解:分出几条直线)
树的度:所有结点中最大的度成为树的度
树的深度:树的最大层数称之为数的深度
三、基本运算
结点总数 = 所有结点度的总和 + 1 (圈圈总数 = 直线总数 + 1)
四、二叉树
1、特点:
a、二叉树可以为空,空的二叉树没有结点,非空二叉树只有一个结点。
b、每个二叉树最多有两颗子树分别为左子树和右子树
c、二叉树左右次序性质不同,不能随意颠倒
2、分类:
a、满二叉树:除了最后一层之外其他每一层的所有结点都有两个子节点
b、完全二叉树:除了最后一层之外,每一层上的结点数均达到最大值;在最后一层上只缺少右边的若干结点
3、性质
性质一、在二叉树的第k层最多有2(k-1)(k>=1)个结点
解释:第一层 1 2(1-1)
第二层 2 2(2-1)
第三层 4 2(3-1)
第四层 8 2(4-1)
性质二、深度为m的二叉树结点最多为2m-1个结点
解释:性质a中的每一层的结果加起来的就是总是了
第一层 1 21 -1
第二层 3 22-1
第三层 7 23-1
第四层 15 24-1
性质三、任意一颗二叉树中,度为0的结点(叶子结点)总是比度为2的结点多一个
解释:随便找几个图数一数感受一下就知道了
性质四、具有n个结点的的二叉树,其深度至少为int(log2n)+1
性质五、具有n个结点的的完全二叉树,其深度为int(log2n)+1
五、二叉树的储存结构
L(i)左子结点的储存地址 | V(i)数据储存区域 | R(I)右子结点的储存地址 |
六、二叉树的遍历
前序遍历:先遍历根结点,然后遍历左子树,然后遍历右子树
中序遍历:先遍历左子树,然后遍历根结点,然后遍历右子树
后序遍历:先遍历左子树,然后遍历右子树,然后遍历根结点
简单一看好像很简单,再一看感觉懂了,实际呢还是一头懵逼,再去百度查查资料争取搞明白,哎,真难!
其实:前中后三种遍历都是针对根结点来说,前序遍历就是根结点写在前面,中序就是根结点在中间,后序遍历就是跟结点在后面。还是不懂我们再看三张我的毕生心血。。。。。
通过三种遍历方式我们显然可以发现,前序会吧根结点写在最前,后序会把根结点写在最后。那么我们根据前序或者更后序就能招到根结点,中序遍历会把根结点写在中间,而且中序遍历方式中跟结点的左边能表示左子树上面的结点,跟结点右边可以表现出右子树上面的结点。因此我们只要知道二叉树的中序遍历和其它遍历方式中的任意一种就能确定出该二叉树的结构,但是如果知道前序后后序是不能确定出二叉树的结构的。
在前序和中序遍历结果中相邻两个结点都不是同层结点