文章目录
1 前言
前面讲到了二叉搜索树(BST)
和二叉平衡树(AVL)
,二叉搜索树
在最好的情况下搜索
的时间复杂度为O(logn)
,但如果插入节点
时,插入元素序列本身
就是有序
的,那么BST树
就退化
成一个线性表
了,搜索
的时间复杂度为O(n)
。
如果想要减少比较次数
,就需要降低树的高度
。在插入
和删除节点
时,要保证插入节点后
不能使叶子节点之间
的深度之差大于1
,这样就能保证整棵树
的深度最小
,这就是AVL树解决BST搜索性能降低的策略
。但由于每次插入
或删除节点后
,都可能会破坏AVL
的平衡
,而要动态保证AVL
的平衡需要很多操作
,这些操作会影响整个数据结构的性能,除非是在树
的结构变化特别少
的情形下,否则AVL树平衡
带来的搜索性能提升
有可能还不足为了
平衡树
所带来的性能损耗
。
因此,引入了2-3树
来提升效率
。2-3树
本质也是一种平衡搜索树
,但2-3树
已经不是一棵二叉树了
,因为2-3树
允许存在3这种节点
,3-节点
中可以存放两个元素
,并且可以有三个子节点
。
2 2-3树定义
2-3树的定义
(1)2-3树要么为空要么具有以下性质:
(2)对于2-节点,和普通的BST节点一样,有一个数据域和两个子节点指针,两个子节点要么为空,要么也是一个2-3树,当前节点的数据的值要大于左子树中所有节点的数据,要小于右子树中所有节点的数据。
(3)对于3-节点,有两个数据域a和b和和三个子节点指针,左子树中所有的节点数据要小于a,中子树中所有节点数据要大于a而小于b,右子树中所有节点数据要大于b。
例如:图2.1所示的树
为一棵2-3树
,树中共有5个2-节点
和3个3-节点
。
图2.1