二叉树、平衡二叉树、B- tree、B+ tree 基本概念

1 二叉树 

        二叉树binary tree是指每个节点最多含有两个子树的树结构。

特点:

        1.所有节点最多拥有两个子节点,即度不大于2

        2.左子树的键值小于根的键值,右子树的键值大于根的键值。

因为二叉树只是定义了简单的结构,所以存在多种深度可能,导致二叉树的效率低,所以引入了平衡二叉树。

二叉树、平衡二叉树、B- tree、B+ tree 基本概念_第1张图片

2 平衡二叉树

2.1 avl树

        平衡二叉树,基于avl算法,即是avl树(avl tree)

特点:

        1.符合二叉树的条件下

        2.任何节点的两个子树的高度最大差为1

        如果在avl 树,中进行插入和删除节点操作,可能导致avl树失去平衡,那么可以通过旋转重新达到平衡。因此我们说的二叉树也称自平衡二叉树。

2.2 红黑树

        红黑树和avl树类似,都是在进行插入和删除操作时通过特定的操作保持二叉树的平衡,从而获得较高的查找性能。

在java中TreeSet,TreeMap的底层就是用的这个方法。

特点:

        1.节点是红色或黑色

        2.根节点是黑色

        3.叶子节点(nil,空节点)是黑色

        4.每个红色节点的两个子节点都是黑色

3 B-tree

        B通常理解成是Balance的意思,B- tree 就是B树。

        B树是平衡多路查找树(有多个查找路径,不止2个),是一种平衡的多叉树。因为B树是平衡树,每个节点到叶子节点的高度都是相同的,这样可以保证B树的查询是稳定的。

        使用B tree 可以显著减少定位记录时所经历的中间过程,从而快速定位,加快存取速度。

        与二叉树相比,B-tree利用多个分支(二叉树只有2个分支)节点,减少了获取记录时所经历的节点数,从而达到节省存取时间的目的。

特点:

        1.每个节点的关键字增多了,特别是B树应用到数据库中的时候。

        数据库充分利用了磁盘块的原理(磁盘数据的存储采用的是块的形式进行存储,每个块的大小一般为4k,每次去取数据的时候,就是取出这个4k的大小,而不是只取出你想要的大小。就是说每次IO的时候,同一磁盘块的数据都是一次性提取出来)。把树的节点关键字增多后,树的层级比原来二叉树的层级少了,这样就可以减少数据查找的次数 ,降低复杂度了。

        2.所有的页节点都在同一层上

B+ tree

        B+tree 是在 B- tree基础上的优化,使其更适应存储索引结构

        B- tree的结构中,每个节点不仅包括数据的key值,也包括data值。而每一页的存储空间都是有限的,如果data数据较大的时候,会导致,每一页中存储的key比较少,当存储的数据量比较大时,同样会导致B- tree的查询深度很大,增加磁盘IO次数,进而影响查询效率

        B+ tree中,非叶子节点上只存储key的信息,这样可以加大每一页中存储key的数量,降低B+ tree的高度。

特点(与B- tree相比):

        1.非叶子节点只存储key信息

        2.所有叶子节点之间有一个链指针

        3.B+的非叶子节点只进行数据的索引,不会存实际的关键字记录的指针,所有数据地址必须要到叶子节点才能获取到,所以每次数据查询的次数都一样。

        4.B+树的应用场景主要是数据库索引结构,数据库的查询有时候可能一次多条,如果分布在不同的层(树的层级),那么在取出数据后,还需要做排序。而在一个层级上,且有指针连接各个叶子节点也使得查询效率更高。

 

参考:

TreeMap

你可能感兴趣的:(算法与数据结构)