二叉树
定义
1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为二叉排序树。
运用了二分查找的思想[复杂度O(logn)],查找所需的最大次数等同于二叉查找树的最大高度。
缺陷
多次插入新节点容易导致不平衡,使查找性能大打折扣,几乎变成了线性查找[复杂度O(n)]如下图:
假设初始的二叉查找树只有三个结点,根结点值为9,左孩子值为8,右孩子值为12
接下来我们依次插入如下五个结点:7,6,5,4,3。依照二叉查找树的特性,结果会变成什么样呢?
2-3-4树
定义
1.所有的叶子节点都拥有相同的深度
2.节点只能是2-节点,3-节点,或者4-节点
- 2节点 包含一个元素的节点,有两个子节点
- 3节点 包含两个元素的节点,有三个子节点
- 4节点 包含三个元素的节点,有四个子节点
所有节点都有至少两个子节点或没有子节点
子节点的定义:
- 2节点 左子树所有元素小于key1,右子树所有元素大于key1
- 3节点 左子树所有元素小于key1,中间子树所有元素大key1小于key2,右子树大于key2
- 4节点 左子树所有元素小于key1,第二个子树所有元素大于key1小于key2,第三个子树所有元素大于key2小于key3,右子树所有元素大于key3
添加操作
添加如果出现需要分裂的情况,分裂出的元素首先和父级合并,如果父级已经是4节点那么将父级分裂,递归操作。
234树的生长全部都是从叶子节点进行生长的,从叶子节点进行分裂向上延伸
为什么要提到234树呢,因为234树和红黑树是完全等价的,在程序中实现234树比较繁琐,所以使用了红黑树来代替。
红黑树
定义
红黑树是一种自平衡的二叉查找树。除了符合二叉查找树的基本特性外,它还具有下列附加特性:
1.结点是红色或黑色。
2.根结点是黑色。
3.每个叶子结点都是黑色的空结点(NIL结点)。
4 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
5.从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。(如果一个结点存在黑子结点,那么该结点肯定有两个子结点)
这些规则保证了红黑树的自平衡。红黑树从根到叶子的最长路径不会超过最短路径的2倍。
下面这棵树就是一颗典型的红黑树
红黑树通过旋转和变色调节自平衡
插入操作
删除操作
注:红黑树插入和删除两张思维导图转自博主安卓大叔