总结关于树的几种数据结构

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+树

  1. 非叶 子节点不保存数据,只用来索引叶子节点。

  2. 叶子节点包含全部元素的信息,叶子节点之间按照从小到大的顺序链接。

关于树的几种数据结构_搜索

  1. 新增

    • 如果要插入的节点已经满了,需要分裂这个节点。

    • 分裂

关于树的几种数据结构_增删改_02

  1. 使用B+树作为数据库索引的优势

    • 查询性能稳定

    • 便于范围查找

4. 2-3-4树

  • 2节点:包含一个数据项和两个儿子的节点

  • 3节点:包含两个数据项和三个儿子的节点

  • 4节点:包含三个数据项和四个儿子的节点。

  • 2-3-4树的每个非叶子节点必须是 2 节点或 3 节点或 4 节点。

     

    关于树的几种数据结构_增删改_03

 

关于树的几种数据结构_数据项_04

 

关于树的几种数据结构_子树_05

  • 新增(为了维护树的平衡,会有一些规则,这就是B树的自平衡)

    • 新增的数据项一定在叶子节点。

    • 如果搜索插入位置的路径中,没有满节点,那就找到合适的叶子节点后再找到合适的位置插入即可。

    • 如果搜索插入位置的路径中,有节点已经满了,那么,需要把那个满的节点分裂之后再新增数据项。

    • 节点分裂(将数据项从左到右设为A,B,C)

      • 创建一个新的空节点。

      • 数据项 C 移到新节点。

      • 数据项 B 移到要分裂节点的父节点。

      • 数据项 A 保留再原来的位置。

      • 最右边的两个子节点连到新节点上。

    • 关于树的几种数据结构_增删改_06

    •  

关于树的几种数据结构_增删改_07#

5. 2-3树

  • 与 2-3-4 树类似,2-3树的节点比2-3-4树少一个数据项。

    关于树的几种数据结构_搜索_08

  • 新增(与2-3-4树不同)

    • 如果新增的数据项要插入的叶子节点不满,直接插入

    • 如果要插入的节点满了,需要对这个节点分裂。

    • 节点分裂

      关于树的几种数据结构_子节点_09

      关于树的几种数据结构_子树_10

       

关于树的几种数据结构_子树_11

6. 红黑树

红黑树的 5 条规则:

  1. 节点是红色或黑色。

  2. 根节点是黑色。

  3. 每个叶子节点都是黑色的空节点(NIL节点)。

  4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。