树、二叉树、二叉查找树、平衡二叉树、B树、B+树

一、树 Tree

树是n个结点的有限集。n=0时称为空树。在任意一棵非空树中:①有且仅有一个根结点;②当n>1时,其余结点可分为m个互不相交的有限集,其中每一个集合本身又是一棵树,称为根的子树。

结点的分类

结点拥有的子树的个数称为结点的度。度为0的结点称为叶结点。度不为0的结点称为分支结点。分支结点包括根结点。除根结点之外的分支结点,称为内部结点。树的度是树内各结点的度的最大值。

结点的层次从根开始算起,根为第一层,根的孩子为第二层。树中结点的最大层次称为树的深度或高度。

 

二、二叉树 Binary Tree

二叉树是一种特殊的树,非空二叉树由一个根结点和两棵分别称为根结点左子树和根结点右子树的二叉树组成。

二叉树的特点

1、每个结点最多有两棵子树。

2、左子树和右子树是有顺序的,次序不能任意颠倒。

3、即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。

特殊二叉树

1、斜树

斜树分为左斜树和右斜树。所有结点都只有左子树的二叉树叫左斜树,所有结点都只有右子树的二叉树叫右斜树。

2、满二叉树

如果二叉树的所有分支结点都存在左子树和右子树,且所有叶子结点都在同一层上,那么这样的二叉树就是满二叉树。

3、完全二叉树

逐层、从左往右给二叉树每个结点编号,如果没有空档,那么这个二叉树就是完全二叉树。满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

二叉树的性质

1、在二叉树的第i层最多有2i-1个结点。

2、深度为k的二叉树最多有2k-1个结点

3、任意一棵二叉树,叶子结点数等于度为2的结点数加1

还有2个性质是专门针对完全二叉树的:

4、具有n个结点的完全二叉树,其深度为不大于log2n的最大整数加1

5、xxx太复杂

 

三、二叉排序树 BST,又称为二叉搜索树、二叉查找树

非空二叉排序树具有如下性质:

1、如果它的左子树不空,则左子树上所有结点的值均小于它的根结点的值。

2、如果它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。

3、它的左右子树也分别为二叉排序树。

个人觉得叫成二叉排序树最合适,因为直到二叉排序树,才对结点的值的顺序有要求,树、二叉树,对结点的值的顺序都没有要求。

 

四、平衡二叉树 AVL树 AVL是两个发明者的名字缩写

平衡二叉树,是一种特殊的二叉排序树,特殊之处在于其每一个结点的左子树和右子树的高度最多相差1。

 

五、多路查找树

多路查找树,其每一个结点的孩子数可以多于两个,且每一个结点可以存储多个元素。

特殊的多路查找树:

1、2-3树

2-3树:每个结点都具有2个或3个孩子。有2个孩子的结点,称之为2结点。有3个孩子的结点,称之为3结点。

一个2结点包含一个元素和两个孩子或没有孩子,且与二叉查找树类似,左子树包含的元素小于该元素,右子树包含的元素大于该元素。不过,与二叉查找树不同的是,2结点要么没有孩子,要么有2个孩子,不能只有1个孩子。

一个3结点包含一小一大两个元素和三个孩子或没有孩子。一个3结点要么没有孩子,要么有3个孩子,不能有其他情况。如果3结点有孩子的话,那么左子树的元素都小于该结点的较小元素,右子树的元素都大于该结点的较大元素,中间子树的元素都介于该结点的两个元素之间。

2、2-3-4树

2-3-4树是2-3树的扩展,包括了4结点的使用。一个4结点包含小中大3个元素和4个孩子或没有孩子。一个4结点要么没有孩子,要么有4个孩子,不会有其他情况。如果某个4结点有孩子的话,左子树的元素都小于最小元素,第二子树的元素都介于最小元素和中等元素之间,第三子树的元素都介于中等元素和最大元素之间,右子树的元素都大于最大元素。

3、B树

B树是一种平衡的多路查找树。2-3树和2-3-4树都是B树的特例。结点的孩子数的最大值称为B树的阶。因此,2-3树是3阶B树,2-3-4树是4阶B树。B树的阶可以很大,也就是说B树中节点的子结点可以很多,远比二叉树的2个要多。

一个m阶的B树具有如下属性:

①如果根结点不是叶子结点,则其至少有两棵子树。

②每一个内部结点都有k-1个元素和k个孩子,每一个叶子结点都有k-1个元素,其中m/2<=k≤m。

③所有叶子结点都位于同一层。

④所有分支结点都包含信息(n,A0,K1,A1,K2,A2,...Kn,An),其中Ki是关键字,且Ki<Ki+1,Ai是指向子树的指针,且指针Ai-1所指子树中所有结点的关键字均小于Ki,Ai所指子树中所有结点的关键字均大于Ki。n为关键字的个数。

一棵1001阶的B树,根结点可以存储1000个关键字,第二层可以存储1001*1000,即100万个关键字,第三层可以存储1001*1001*1000,即10亿个关键字。我们只需要让根结点常驻内存,那么在这棵树上寻找某一个关键字,最多只需要两次硬盘读取。也就是说,B树可以减少硬盘读取次数。可以说,B树就是为内外存的数据交互准备的。外存即指硬盘、软盘等非内存存储设施。

4、B+树

B+树是应文件系统所需而出的一种B树的变形树。在B树中每一个元素只出现一次,要么在分支结点中,要么在叶子结点中。而在B+树中,出现在分支结点中的元素也会出现在叶子结点中。

B+树和B树的不同点:

1)、B+树叶子结点包含了全部关键字信息,而B树叶子结点仅包含部分关键字信息,其余关键字信息分布在分支结点中。

2)、B+树叶子结点中有一个指向后一个叶子结点的指针,使得叶子结点依关键字的大小自小而大顺序链接,而B树没有。

如果要从最小关键字开始进行顺序查找,就可以从最左侧的叶子结点出发,不经过分支结点,而是沿着指向下一个叶子结点的指针就可以遍历所有的关键字。

3)、B+树只有叶子结点存储了关键字和data,分支结点仅存储了关键字,而B树所有节点都存储了关键字和data。在Innodb引擎、主键索引场景下,关键字指的是主键字段值,data指的是除主键字段外,其他字段的数据。在Innodb引擎、非主键索引场景下,关键字指的是索引字段值,data指的是主键字段值。

B树如下:

 

B+树如下:

为什么数据库索引选择用B+树存储,而不用B树存储?

1、B+树的磁盘读取代价更低。因为B+树分支结点不存储data,所以相对于B树来说一个结点可以存储更多的关键字,所以树的高度就会相对较小,从而需要较小的读取次数。

2、B+树查询效率更稳定。因为B+树都是读到叶子节点,即访问层数固定,而B树可能读到任意层,所以可能会出现查询一个数据比较快,而查询另一个数据比较慢的情况。

3、因为有指向下一个叶子结点的指针存在,所以B+树对范围查询的支持更好。

posted on 2017-04-28 11:12  koushr  阅读(649)  评论(0编辑  收藏  举报

导航