推荐数据结构在线学习连接:(可以动态演示数据结构存储情况)

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

二叉树、红黑树、B树、B+树也可以参考其他总结,如下:

https://blog.csdn.net/ff_simon/article/details/101055134

一、二叉树

定义:树中的每个节点最多只能有两个子节点,这样的树是二叉树。

1.二叉搜索树:一个节点的左子节点的关键字值小于这个父节点,右子节点的关键字值大于等于这个父节点。

2.平衡二叉搜索树:它是一颗裸空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两棵子树都是平衡二叉树。它的实现方式有:红黑树,AVL

二叉搜索树的结构如下:(左孩<父亲,右孩>=父亲)

二叉树、B树、B+树总结

(1)查找方法:将关键字值key与根节点的关键字值做比较,小于root节点的关键字值,进入root节点的左子树进行比较;否则如果大于,进入root节点的右子树进行比较。依次比较下去,直到key的值等于某个节点的关键字值,则将该节点Node返回。

(2)插入操作,先要确定新节点要插入的位置,这个就是查找的过程;然后确定位置后,将新节点newNode作为父节点parent的的左子节点或者右子节点

(3)遍历操作,是指根据特定的顺序访问树的每一个节点。遍历方法有:中序遍历,前序遍历,后序遍历

(4)查找最大值,从根节点开始走向右子节点,然后一直走向右子节点,直到最后一个不为null的右子节点,就是最大值。查找最小值,是类似的,一直走向左子节点。

缺点:当已排序的数据逐个存入时,后续添加和查找的复杂度和单个数组是一样的,节点定位效率比较低。如:

二叉树、B树、B+树总结                      二叉树、B树、B+树总结

二、B树

b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢? 
因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。(MySQL InnoDB引擎默认的索引磁盘页大小为16kb,如果key为int类型 可以存储1770个左右,因此高度为3的B+树可以存储大概20000w个索引)

 

B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点。

  • 根节点至少有两个子节点
  • 每个节点有M-1个key,并且以升序排列
  • 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间
  • 其它节点至少有M/2个子节点

以下为M=3(每个节点有1到3-1对key-value) 的B树结构(该树高度为3,从根节点开始最多3次IO操作就可以检索到值)

二叉树、B树、B+树总结

以下为M=4,的B树结构(该树高度为4,从根节点开始最多4次IO操作就可以检索到值)

二叉树、B树、B+树总结

 

三、B+树

B+树是对B树的一种变形树,它与B树的差异在于:

  • 有k个子结点的结点必然有k个关键码;
  • 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
  • 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。(可以实现快速的范围查询,如>90的数据)

以下为M=3(每个非叶子节点有1到3-1个key,叶子节点有1到3-1对 key-value) 的B+树结构

二叉树、B树、B+树总结

特点:叶子节点按从小到大的顺序存储了全部的数据,非叶子节点无数据信息只是用来定位元素位置的(即只有索引作用)。

B和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。

B+ 树的优点在于:

  • 由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子节点上关联的数据也具有更好的缓存命中率。
  • B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。

但是B树也有优点,其优点在于,由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。下面是B 树和B+树的区别图:

二叉树、B树、B+树总结

相关文章: