平衡树
查找树相较于链表数组来说,查找效率很高,我们知道影响查找树效率的最大因素就是查找树的深度,最坏的情况就是所有的结点都在根结点的一侧就像下面这种情况
平衡树思想就是为了优化树的查找,让根结点两侧结点数目“平衡”,来达到降低查找树高度的目的
2-3查找树
2-3查找树是一种平衡树的思想
我们将标准二叉查找树的结点称为2-结点(含有一个键和两条链),而现在我们引入3-结点,它含有两个键和三条链。每一条链就是一个分区
2-3查找树定义
一棵2-3查找树要么为空,要么满足满足下面两个要求:
2-结点:
含有一个键(及其对应的值)和两条链,左链接指向2-3树中的键都小于该结点,右链接指向的2-3树中的键都大
于该结点。
3-结点:
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
含有两个键(及其对应的值)和三条链,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的两个键之间,右链接指向的2-3树中的键都大于该结点。
2-3查找树平衡调整
破坏平衡性的操作无非就是插入和删除
2-3查找树的插入
与普通查找树在空连接种插入不同,2-3查找树是在空连接的父节点中插入。
根据父节点的情况可以分为一下几种情况
1.父节点是2-结点
如果是2-结点则向该2-结点中插入新键,将2-结点变成3-结点,没有增加树的高度所以无需调整
2.父节点是3-结点
如果是3-结点则向该3-结点中插入新键,将3-结点变成4-结点。在2-查找树中没有4-结点的定义,所以我们将4-结点拆分成两个2-结点
按照上图E结点会继续加入到它的父结点中,这样就又会产生判断,父节点是2-结点,父节点是3-结点:
如果是2-结点:变成3-结点
如果是3-结点:
变成临时的4-结点,在分解成2个2-结点,产生的中间元素提升至父节点直到找到一个2-结点,将这个2-结点变成3-结点。
分解根结点
如果直到找到根结点也没有找到2-结点,则将根节点变成临时4-结点,再分解成2个2-结点,中间结点成为新的跟结点
树的深度+1
2-3查找树的性质
1.2-3查找树是平衡树,从任意一个空连接到根结点的路径长度是相等的
2.4-结点变成两个2-结点时树的高度不会发生变化,只有当跟根结点时临时4-结点分裂成2个2-结点时树高才+1,这就极大的降低了树的高度,优化了查找
3.与普通的二叉查找树相比最大的区别是,2-3树是从下往上构造的