二叉树:有序,每个根树有左右两个子树;左子树小于根节点,右子树大于根节点。
平衡二叉树(AVL Tree):对二叉树左右子树的高度进行平衡化处理,高度绝对值小于1。时间复杂度是O(lgn);失去平衡的二叉树可以概括为四种姿态:LL(左左)、RR(右右)、LR(左右)、RL(右左)。
红黑树(Red-Black Tree):
- 每个节点包含五个域:color、key、left、right、p
- 每个节点或者是黑色,或者是红色
- 根节点和(NIL)是黑色的
- 红色节点的父、左子、右子节点必须是黑色
- 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
应用:主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。
例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。
B-Tree: 有序数组+平衡多叉树
每个节点最多有m个孩子。
除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
若根节点不是叶子节点,则至少有2个孩子
所有叶子节点都在同一层,且不包含其它关键字信息
B树在插入删除新的数据记录会破坏B-Tree的性质,因为在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持B-Tree性质。
B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值
B+Tree: 有序数组链表+平衡多叉树
在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
B+Tree相对于B-Tree有几点不同:
1.非叶子节点只存储键值信息。
2.所有叶子节点之间都有一个链指针。
3.数据记录都存放在叶子节点中。
通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。