总结关于树的几种数据结构
1. 二叉搜索树
-
新增节点
-
新增的节点一定是叶子节点。
-
删除节点
-
如果删除的节点是叶子节点,直接删除。
-
如果删除的节点仅有左子树或仅有右子树,用子树的根节点代替它。
-
如果删除的节点既有左子树又有右子树:删除节点的右子树中找到最小的节点代替它。
-
2. B树
-
平衡树:任意节点的左右子树高度差都小于等于 1
-
B树(Balanced Tree),指可以「自平衡」的树。
-
2-3树,2-3-4树都是B树。
-
为了维护树的平衡,对于节点和增删改操作就要有一些规则。
-
一个m阶的B树(每个节点都有m路查找,m阶就是m路)具有如下特性
-
根节点至少有两个子节点
-
每个中间节点都包含 k-1 个元素和 k 个孩子
-
每个叶子节点都包含 k-1 个元素,其中 m/2 <= k <= m
-
所有的叶子节点都位于同一层
-
每个节点中的元素从小到大排列,节点当中 k-1 个元素正好是k个孩子包含的元素的值域划分。
-
-
不同的阶数有不同的增删改操作
-
3. B+树
-
非叶 子节点不保存数据,只用来索引叶子节点。
-
叶子节点包含全部元素的信息,叶子节点之间按照从小到大的顺序链接。
-
新增
-
如果要插入的节点已经满了,需要分裂这个节点。
-
分裂
-
-
使用B+树作为数据库索引的优势
-
查询性能稳定
-
便于范围查找
-
4. 2-3-4树
-
2节点:包含一个数据项和两个儿子的节点
-
3节点:包含两个数据项和三个儿子的节点
-
4节点:包含三个数据项和四个儿子的节点。
-
2-3-4树的每个非叶子节点必须是 2 节点或 3 节点或 4 节点。
-
新增(为了维护树的平衡,会有一些规则,这就是B树的自平衡)
-
新增的数据项一定在叶子节点。
-
如果搜索插入位置的路径中,没有满节点,那就找到合适的叶子节点后再找到合适的位置插入即可。
-
如果搜索插入位置的路径中,有节点已经满了,那么,需要把那个满的节点分裂之后再新增数据项。
-
节点分裂(将数据项从左到右设为A,B,C)
-
创建一个新的空节点。
-
数据项 C 移到新节点。
-
数据项 B 移到要分裂节点的父节点。
-
数据项 A 保留再原来的位置。
-
最右边的两个子节点连到新节点上。
-
-
-
#
5. 2-3树
-
与 2-3-4 树类似,2-3树的节点比2-3-4树少一个数据项。
-
新增(与2-3-4树不同)
-
如果新增的数据项要插入的叶子节点不满,直接插入
-
如果要插入的节点满了,需要对这个节点分裂。
-
节点分裂
-
6. 红黑树
红黑树的 5 条规则:
-
节点是红色或黑色。
-
根节点是黑色。
-
每个叶子节点都是黑色的空节点(NIL节点)。
-
每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
-
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。