1、概念
- 度(Degree程度):节点拥有的直接孩子个数,度为0的节点称为叶子节点。就是叉的个数。
- 阶(度):一个节点的子节点个数,树的阶为所有节点中阶最大的节点的阶。就是叉的个数。
- 树的度:树内节点度最大的那个是树的度。
- 深度(高度):根节点为第一层,深度为0,往下依次,最大层次称为数的深度或者高度。
- 最小不平衡子树:距离插入节点最近的,且平衡因子绝对值大于1的节点为根的子树。
- 满二叉树:除叶子节点外,所有节点都有两个子节点。
- 完全二叉树:叶子节点在最后一层且是从左往右排列。
2、二叉排序树(二叉查找树)
- 是一棵二叉树;
- 若任意节点左子树不为空,左子树上所有节点值小于根节点值;
- 若任意节点右子树不为空,右子树上所有节点值大于根节点值。
3、平衡二叉树(AVL树)
Adelson-Velsky and Landis Tree是以人名命名的。
- 是一棵二叉排序树;
- 任意节点左右子树高度差不超过1。
4、红黑树
- 每个节点颜色不是黑色,就是红色
- 根节点是黑色的
- 叶子节点是黑色的
- 如果一个节点是红色,那么它的两个子节点就是黑色的(没有连续的红节点)
- 对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点
这几个规则最终的效果就是:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长,使得维护树平衡的代价和搜索性能得到一个平衡。
了解红黑树,可以先从2-3-4树开始,
5、B树(多路查找树)
一个m阶B树需要满足的条件:
- 每个节点最多只有m个子节点。(因为是m阶)
- 每个内部节点(根节点和叶子节点之间的节点)具有至少m/2个子节点。
- 如果根不是叶节点,则根至少有两个子节点。
- 具有k个子节点的非叶节点包含k -1个键。
- 所有叶子都出现在同一水平(所以所有叶子高度都一致)。
上面的定义很晦涩,总结来说就是B树每个节点都包含数据,且所有叶子节点都在一层,看起来B树应该是一个很整齐的树,没有参差不齐。
6、B+树
- 有m个子树的中间节点包含有m个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引;
- 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息);
- 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息);
B+树只有叶子节点包含数据,非叶子节点只有索引,B+树的叶子节点也在同一层,这一点和B树一样,但是B+树的叶子节点通过指针链接,所以是按索引顺序形成的链,这样在根据索引进行范围查询时也会很快。B树和B+树组织的数据都存放在磁盘上,而且实际使用时,数据量不会小,所以在进行查询时,是需要多次进行磁盘IO操作的,mongodb使用b树的原因是他多进行key的搜索,数据分布在节点上,平均下来磁盘IO会较少,如果使用B+树,必须进行到叶子节点才能取出数据,平均下来磁盘IO会较多。MySQL使用的是B+树组织聚簇索引,在进行等值查询时,效果确实不如B树,但是MySQL中还有大量的范围查询,B+树由于叶子节点是按顺序链接的,所以范围查询上会占绝对优势,综合起来,MySQL适合使用B+树。