2-3平衡树·红黑树的前身
什么是2-3树
- 为什么使用树结构
- 从最根本的原因来看,使用树结构结束为了提升整体的效率: 插入、删除、查找(索引),尤其是索引操作。相比于链表,一个平衡树的索引时间复杂度是O(logN),而链表的索引时间复杂度是O(N)
树与链表索引耗时对比:
- 二叉搜索树退化链表
- 二叉搜索树退化链表
- 二叉搜索树插入过程: 插入节点与当前树节点做比对,小于在左,大于在右
- 随着插入顺序不同,就会出现完全不同的数据结构,可能是一颗平衡二叉树,也极有可能出现退化成链表的树
- 当树结构退化成链表后,整个树索引的性能也随之退化成链表
- 2-3树解决平衡问题
- 二叉搜索树和2-3平衡树对比
- 2-3树: 在保证树结构的基础上,允许一个节点中有两个元素,当元素数量等于3个的时候在进行调整,以保证整个二叉搜索树的平衡性
2-3树的使用
- 树结构定义和特点性质
- 2-3树的特点:
- 2-3树的性质:
- 2-3树所有的子叶节点都在同一层
- 1个节点可以有1-2个数据,如果有三个则需要调整树结构
- 1个节点1个数据时,则有两个子节点
- 1个节点2个数据时,则有三个子节点,且中间子节点是介于两个节点间的值
数据插入
数据插入过程中2-3平衡树的演化
- α,向节点1插入数据2,此时为了保持平衡,不会新产生分支,只会在一个节点中存放两个节点
- β,继续插入数据3,此时这个节点有三数据,1、2、3,是一个临时区域
- γ,把三个数据的节点,中间节点拉起来,调整成树形结构
- δ,继续插入数据4,为了保持树平衡,会插在节点3的右侧
- ε,继续插入数据5,插入后3、4、5共用1个节点,当一个节点上有三个数据时候,则需要进行调整
- ζ,中间节点4向上调整,调整后,1节点在左、3节点在中间、5节点在右
- η ,继续插入数据6,在保持树平衡的情况下,与节点5公用
- θ ,继续插入数据7,插入后,节点7会与当前的节点 5 6 共用。此时是一个临时存放,需要调整。初步调整后,抽出6节点,向上存放,变为2 4 6共用一个节点,这是一个临时状态,还需要继续调整
- ι,因为根节点有三个数据2、4、6,则继续需要把中间节点上移,1、3和5、7 则分别成二叉落到节点2、节点6上
数据删除
- 删除的两种情况:
- 删除了3-的节点,也就是包含两个数据元素的节点,直接删除即可,不会破坏树平衡
- 删除了2-的节点,此时会破坏树平衡,需要将树高缩短或者元素进行合并使树平衡恢复
- 数据删除过程中2-3平衡树的演化
- α,删除节点7,因为节点7只有一个数据元素,删除节点5、6合并,但此时破坏了2-3树的平衡性,需要缩短树高进行调整
- β,因为删除节点后,整个树结构不平衡,所以需要缩短树高,调整元素。节点2、4合并,节点1、3分别插入左侧和中间
- γ,删除节点6,这个节点是3-节点(可以分出3个叉的意思),删除后不会破坏树平衡,保持不变
- δ,删除节点5,此时会破坏树平衡,需要把跟节点4下放,与3合并
- ε,删除节点4,这个节点依旧是3-节点,所以不需要改变树结构
- ζ,删除节点3,此时只有1、2节点,需要合并
- η ,删除节点2,此时节点依旧是3-节点,所以不需要改变树结构
- 数据索引
- 小于当前节点值,左侧寻找
- 大于当前节点值,右侧寻找
- 一直到找到索引值,停止